HDU 2234 IDA*

无题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

posted @ 2016-12-05 16:24  ガ落涙『不變』  阅读(93)  评论(0编辑  收藏  举报