#include<bits/stdc++.h>usingnamespace std;
int ret;
int n, a[24][24], origin[24][24];
voidrotate(){
int temp[24][24];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
temp[i][j] = a[n-j-1][i]; // 반시계방향 회전
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
a[i][j] = temp[i][j];
}
}
}
voidmoveleft(){
int temp[24][24] = {0,};
for(int i = 0; i < n; i++) {
int c = -1; // 숫자를 채울 위치int d = 0; // 합치기 가능 여부 (1:가능, 0:불가능)for(int j = 0; j < n; j++) {
if(a[i][j] == 0) continue; // 빈 칸은 건너뛰기if(d && a[i][j] == temp[i][c]) {
// 이전 숫자와 현재 숫자가 같고, 합치기가 가능하면
temp[i][c] *= 2; // 숫자를 합침
d = 0; // 합치기 불가능 상태로 변경
} else {
// 새로운 위치에 숫자를 넣음
temp[i][++c] = a[i][j];
d = 1; // 합치기 가능 상태로 변경
}
}
// 남은 부분을 0으로 채움for(c++; c < n; c++) temp[i][c] = 0;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
a[i][j] = temp[i][j];
}
}
}
voidgo(vector<int>& v){
for(int dir : v) {
if(dir == 0) { // 위쪽rotate();
rotate();
rotate();
moveleft();
rotate();
}
elseif(dir == 1) { // 아래쪽rotate();
moveleft();
rotate();
rotate();
rotate();
}
elseif(dir == 2) { // 왼쪽moveleft();
}
else { // 오른쪽rotate();
rotate();
moveleft();
rotate();
rotate();
}
}
int mx = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
mx = max(mx, a[i][j]);
}
}
ret = max(ret, mx);
}
voidbok(){
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
a[i][j] = origin[i][j];
}
}
}
voidcombi(vector<int>& v){
if(v.size() == 5) {
bok();
go(v);
return;
}
for(int i = 0; i < 4; i++) {
v.push_back(i);
combi(v);
v.pop_back();
}
}
intmain(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> origin[i][j];
}
}
vector<int> v;
combi(v);
cout << ret;
return0;
}
* 큰돌코드
중복조합대신 ,재귀이용
구조체 이용, 초기화를 편하게
구조체는 매개변수 전달시 값이 복사됨
배열은 참조값이 전달
#include<bits/stdc++.h>usingnamespace std;
int ret, n;
// 게임판을 표현하는 구조체structBoard{int a[24][24]; // 게임판 배열// 게임판을 시계방향으로 90도 회전하는 함수void _rotate90(){
int temp[24][24];
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
// (i,j)위치에 (n-j-1,i)위치의 값을 넣어 90도 회전
temp[i][j] = a[n - j - 1][i];
}
}
memcpy(a, temp, sizeof(a)); // 회전된 결과를 원본 배열에 복사
}
// 왼쪽으로 이동하고 같은 숫자는 합치는 함수void _move(){
int temp[24][24];
for(int i = 0; i < n; i++){
int c = -1; // 숫자를 채울 위치int d = 0; // 합치기 가능 여부 (1:가능, 0:불가능)for(int j = 0; j < n; j++){
if(a[i][j] == 0) continue; // 빈 칸은 건너뛰기if(d && a[i][j] == temp[i][c]){
// 이전 숫자와 현재 숫자가 같고, 합치기가 가능하면
temp[i][c] *= 2; // 숫자를 합침
d = 0; // 합치기 불가능 상태로 변경
}else{
// 새로운 위치에 숫자를 넣음
temp[i][++c] = a[i][j];
d = 1; // 합치기 가능 상태로 변경
}
}
// 남은 부분을 0으로 채움for(c++; c < n; c++) temp[i][c] = 0;
}
memcpy(a, temp, sizeof(a)); // 결과를 원본 배열에 복사
}
// 게임판에서 가장 큰 숫자를 찾는 함수voidget_max(){
for(int i = 0;i < n; i++){
for(int j = 0; j < n; j++){
ret = max(ret, a[i][j]);
}
}
}
};
// 재귀적으로 모든 가능한 이동 조합을 시도하는 함수voidgo(Board c, int here){
if(here == 5){ // 5번 이동했으면
c.get_max(); // 최대값 갱신return;
}
for(int i = 0; i < 4; i++){
Board d = c; // 현재 상태 복사
d._move(); // 왼쪽으로 이동go(d, here + 1); // 다음 단계 진행
c._rotate90(); // 90도 회전하여 다른 방향 이동 준비
}
return;
}
intmain(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n; // 보드 크기 입력
Board c; // 게임판 생성// 초기 상태 입력for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> c.a[i][j];
}
}
go(c, 0); // 게임 시작
cout << ret << "\n"; // 최대값 출력return0;
}