HDU 2234 IDA*

来源:互联网 发布:书生软件安卓 编辑:程序博客网 时间:2024/06/05 02:40
无题I

Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1648    Accepted Submission(s): 640

Problem Description
一天机器人小A在玩一个简单的智力游戏,这个游戏是这样的,在一个4*4的矩阵中分别有4个1,4个2,4个3和4个4分别表示4种不同的东西,每一步小A可以把同一行的4个数往左移或者往右移一步或者把同一列的4个数字往上移或者往下移一步(1,2,3,4往左移后是2,3,4,1),小A现在想知道进过最少的几步移动可以将矩阵的每行上的4个数字都一样或者每列上的4个数字都一样。但是小A又不想走太多步,他只要知道最少步数是否少于等于5步,是的话输出准确的步数,否则输出-1。
 
Input
先输入一个整数T,表示有T组数据。
对于每组数据输入4行,每行4列表示这个矩阵。
 
Output
对于每组输入输出一个正整数表示最少的移动步数,大于5则输出-1.
 
Sample Input
2
1 2 3 4
1 2 3 4
1 2 3 4
2 3 4 1
 
4 1 1 1
1 2 2 2
2 3 3 3
3 4 4 4
 
Sample Output
1
1
 
  1 #include <iostream>  2 #include <cstring>  3 using namespace std;  4 int num[4][4],h;  5 int check(){  6     int flag=0;  7     for(int i=0;i<4;i++){  8         for(int j=1;j<4;j++){  9             if(num[i][j]!=num[i][0]){ 10                 flag=1; 11                 break; 12             } 13         } 14         if(flag){ 15             for(int j=1;j<4;j++){ 16                 if(num[j][i]!=num[0][i]){ 17                     return 0; 18                 } 19             } 20         } 21     } 22     return 1; 23 } 24  25 void up(int i){ 26     int t; 27     t=num[0][i]; 28     for(int j=0;j<3;j++){ 29         num[j][i]=num[j+1][i]; 30     } 31     num[3][i]=t; 32 } 33  34 void down(int i){ 35     int t; 36     t=num[3][i]; 37     for(int j=3;j>0;j--){ 38         num[j][i]=num[j-1][i]; 39     } 40     num[0][i]=t; 41 } 42  43 void left(int i){ 44     int t; 45     t=num[i][0]; 46     for(int j=0;j<3;j++){ 47         num[i][j]=num[i][j+1]; 48     } 49     num[i][3]=t; 50 } 51  52 void right(int i){ 53     int t; 54     t=num[i][3]; 55     for(int j=3;j>0;j--){ 56         num[i][j]=num[i][j-1]; 57     } 58     num[i][0]=t; 59 } 60  61 int get_h(){ 62     int s1=0,s2=0,ans; 63     int a[5]; 64     for(int i=0;i<4;i++){ 65         memset(a,0,sizeof(a)); 66         ans=0; 67         for(int j=0;j<4;j++){ 68             a[num[i][j]]=1; 69         } 70         for(int j=1;j<=4;j++){ 71             ans+=a[j]; 72         } 73         s1=max(s1,ans-1);  74     } 75     for(int j=0;j<4;j++){ 76         memset(a,0,sizeof(a)); 77         ans=0; 78         for(int i=0;i<4;i++){ 79             a[num[i][j]]=1; 80         } 81         for(int i=1;i<=4;i++){ 82             ans+=a[i]; 83         } 84         s2=max(s2,ans-1);  85     } 86     return min(s1,s2); 87 } 88  89 int IDA(int ans){ 90     if(ans==h){ 91         return check(); 92     } 93     if(ans+get_h()>h){ 94         return 0; 95     } 96     for(int i=0;i<4;i++){ 97         left(i); 98         if(IDA(ans+1)){ 99             return 1;100         }101         right(i);//还原102         right(i);103         if(IDA(ans+1)){104             return 1;105         }106         left(i);//还原107     }108     for(int i=0;i<4;i++){109         up(i);110         if(IDA(ans+1)){111             return 1;112         }113         down(i);//还原114         down(i);115         if(IDA(ans+1)){116             return 1;117         }118         up(i);//还原119     }120     return 0;121 }122 123 int main(){124     cin.sync_with_stdio(false);125     int T;126     cin>>T;127     while(T--){128         for(int i=0;i<4;i++){129             for(int j=0;j<4;j++){130                 cin>>num[i][j];131             }132         }133         if(check()){134             cout<<"0"<<endl;135         }136         else{137             h=1;138             while(h<=5){139                 if(IDA(0)){140                     break;141                 }142                 h++;143             }144             if(h<=5){145                 cout<<h<<endl;146             }147             else{148                 cout<<"-1"<<endl;149             }150         }151     }152     return 0;153 }

 

2016-12-05 16:24:07

原创粉丝点击