都是泪。
h_row()是求让行相等的最少步
h_col()是求让列相等的最少步
然后神奇的是:
if( h_col() + deep <= maxdeep || h_col() + deep <= maxdeep ){
//************
//*********
}
这样是不行的
int tempp = min( h_col(), h_row() );
if( tempp + deep <= maxdeep ){
//*******
//******
}
而这个才是正确的。。。。次奥!
好吧,刚刚看了下,一点都不神奇,上面那个||右边应该是h_row()的,好吧手滑了,哎,都是泪
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
int num[5][5];
int maxdeep;
bool check(){
int flag = 1;
for( int i = 1; i <= 4; i++ ){
for( int j = 1; j < 4; j++ ){
if( num[i][j] != num[i][j+1] ){
flag = 0;
break;
}
}
if( flag == 0 ){
break;
}
}
if( flag ){
return true;
}
flag = 1;
for( int i = 1; i <= 4; i++ ){
for( int j = 1; j < 4; j++ ){
if( num[j][i] != num[j+1][i] ){
flag = 0;
break;
}
}
if( flag == 0 ){
break;
}
}
if( flag ){
return true;
}else{
return false;
}
}
int h_row(){
int ans = MAX, cnt[5];
for( int i = 1; i <= 4; i++ ){
memset( cnt, 0, sizeof( cnt ) );
for( int j = 1; j <= 4; j++ ){
cnt[num[i][j]]++;
}
int maxi = 0;
for( int j = 1; j <= 4; j++ ){
maxi = max( maxi, cnt[j] );
}
ans = min( ans, maxi );
}
return 4 - ans;
}
int h_col(){
int ans = MAX, cnt[5];
for( int i = 1; i <= 4; i++ ){
memset( cnt, 0, sizeof( cnt ) );
for( int j = 1; j <= 4; j++ ){
cnt[num[j][i]]++;
}
int maxi = 0;
for( int j = 1; j <= 4; j++ ){
maxi = max( maxi, cnt[j] );
}
ans = min( ans, maxi );
}
return 4 - ans;
}
int row_left( int r ){
int temp = num[r][1];
for( int i = 1; i < 4; i++ ){
num[r][i] = num[r][i+1];
}
num[r][4] = temp;
return 0;
}
int row_right( int r ){
int temp = num[r][4];
for( int i = 4; i > 1; i-- ){
num[r][i] = num[r][i-1];
}
num[r][1] = temp;
return 0;
}
int col_up( int c ){
int temp = num[1][c];
for( int i = 1; i < 4; i++ ){
num[i][c] = num[i+1][c];
}
num[4][c] = temp;
return 0;
}
int col_down( int c ){
int temp = num[4][c];
for( int i = 4; i > 1; i-- ){
num[i][c] = num[i-1][c];
}
num[1][c] = temp;
return 0;
}
bool DFS( int deep ){
if( deep == maxdeep ){
return check();
}
int tempp = min( h_col(), h_row() );
if( tempp + deep <= maxdeep ){
for( int i = 1; i <= 4; i++ ){
col_up( i );
if( DFS( deep + 1 ) ){
return true;
}
col_down( i );
}
for( int i = 1; i <= 4; i++ ){
col_down( i );
if( DFS( deep + 1 ) ){
return true;
}
col_up( i );
}
for( int i = 1; i <= 4; i++ ){
row_left( i );
if( DFS( deep + 1 ) ){
return true;
}
row_right( i );
}
for( int i = 1; i <= 4; i++ ){
row_right( i );
if( DFS( deep + 1 ) ){
return true;
}
row_left( i );
}
}
return false;
}
int main(){
int T;
cin >> T;
while( T-- ){
for( int i = 1; i <= 4; i++ ){
for( int j = 1; j <= 4; j++ ){
cin >> num[i][j];
}
}
for( maxdeep = 0; maxdeep <= 5; maxdeep++ ){
if( DFS( 0 ) ){
break;
}
}
if( maxdeep > 5 ){
cout << -1 << endl;
}else{
cout << maxdeep << endl;
}
}
return 0;
}