#include #define endl '\n' using namespace std; const int maxN = 205; struct colorc { int r, g, b; colorc(){} colorc(int r, int g, int b) { this->r = r; this->g = g; this->b = b; } }; struct indices { int i, j; indices(){} indices(int i, int j) { this->i = i; this->j = j; } }; int z, min_diff = INT_MAX, ans_i, ans_j; string road; indices current_board[maxN][maxN]; colorc current[maxN][maxN], correct[maxN][maxN]; int check_diff(indices board[][maxN]) { int current_diff = 0; for(int i = 0; i < 200 / z; i++) { for(int j = 0; j < 200 / z; j++) { int ind_i = board[i * z][j * z].i / z, ind_j = board[i * z][j * z].j / z; for(int row = 0; row < z; row++) { for(int col = 0; col < z; col++) { int r_current = current[ind_i * z + row][ind_j * z + col].r, r_correct = correct[i * z + row][j * z + col].r, g_current = current[ind_i * z + row][ind_j * z + col].g, g_correct = correct[i * z + row][j * z + col].g, b_current = current[ind_i * z + row][ind_j * z + col].b, b_correct = correct[i * z + row][j * z + col].b; current_diff += sqrt((r_current - r_correct) * (r_current - r_correct) + (g_current - g_correct) * (g_current - g_correct) + (b_current - b_correct) * (b_current - b_correct)); } } } } return current_diff; } void brute_force(indices board[][maxN], int cnt_moves, string current_road, int blanki, int blankj) { int diff = check_diff(board); if(diff + cnt_moves < min_diff && cnt_moves != 0) { ans_i = blanki / z; ans_j = blankj / z; min_diff = diff + cnt_moves; road = current_road; } if(cnt_moves == 5) return; indices blank; for(int i = 0; i < 200 / z; i++) { for(int j = 0; j < 200 / z; j++) { if(board[i * z][j * z].i == blanki && board[i * z][j * z].j == blankj) { blank = indices(i * z, j * z); break; } } } if(blank.i != 0) { swap(board[blank.i][blank.j], board[blank.i - z][blank.j]); brute_force(board, cnt_moves + 1, current_road + 'U', blanki, blankj); swap(board[blank.i][blank.j], board[blank.i - z][blank.j]); } if(blank.j != 200 - z) { swap(board[blank.i][blank.j], board[blank.i][blank.j + z]); brute_force(board, cnt_moves + 1, current_road + 'R', blanki, blankj); swap(board[blank.i][blank.j], board[blank.i][blank.j + z]); } if(blank.i != 200 - z) { swap(board[blank.i][blank.j], board[blank.i + z][blank.j]); brute_force(board, cnt_moves + 1, current_road + 'D', blanki, blankj); swap(board[blank.i][blank.j], board[blank.i + z][blank.j]); } if(blank.j != 0) { swap(board[blank.i][blank.j], board[blank.i][blank.j - z]); brute_force(board, cnt_moves + 1, current_road + 'L', blanki, blankj); swap(board[blank.i][blank.j], board[blank.i][blank.j - z]); } } int main() { freopen("puzzle.in", "r", stdin); freopen("puzzle.out", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>z; for(int i = 0; i < 200; i++) { for(int j = 0; j < 200; j++) { int r, g, b; cin>>r>>g>>b; current[i][j] = colorc(r, g, b); } } for(int i = 0; i < 200; i++) { for(int j = 0; j < 200; j++) { int r, g, b; cin>>r>>g>>b; correct[i][j] = colorc(r, g, b); current_board[i][j] = indices(i, j); } } brute_force(current_board, 0, "", 0, 0); brute_force(current_board, 0, "", z, z); brute_force(current_board, 0, "", 2 * z, 2 * z); brute_force(current_board, 0, "", 200 - z, z); brute_force(current_board, 0, "", 200 - z, 200 - z); brute_force(current_board, 0, "", 200 - z, 0); brute_force(current_board, 0, "", 0, 200 - z); //cout<