标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5307 Accepted Submission(s): 2360
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 struct node 7 { 8 int num[4]; 9 int s; 10 } s1,s2,fs,fe; 11 int ha[10][10][10][10]; //用来标记,是否出现过这四个数字的字符串,1为已出现 12 13 void BFS() 14 { 15 int i; 16 queue <node> q; 17 while(!q.empty()) 18 q.pop(); 19 fs.s=0; 20 s1=fs; //初始化 21 ha[s1.num[0]][s1.num[1]][s1.num[2]][s1.num[3]]=1; 22 q.push(s1); 23 while(!q.empty()) 24 { 25 s1=q.front(); 26 q.pop(); 27 for(i=0; i<4; i++) 28 if(s1.num[i]!=fe.num[i]) 29 break; 30 if(i==4) //4个数字全部相同,输出结果 31 { 32 printf("%d\n",s1.s); 33 return; 34 } 35 for(i=0; i<4; i++) //加1变化 36 { 37 s2=s1; 38 if(s1.num[i]==9) s2.num[i]=1; 39 else s2.num[i]=s1.num[i]+1; 40 s2.s=s1.s+1; 41 if(!ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]) 42 { 43 ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]=1; 44 q.push(s2); 45 } 46 } 47 for(i=0; i<4; i++) //减1变化 48 { 49 s2=s1; 50 if(s1.num[i]==1) s2.num[i]=9; 51 else s2.num[i]=s1.num[i]-1; 52 s2.s=s1.s+1; 53 if(!ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]) 54 { 55 ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]=1; 56 q.push(s2); 57 } 58 } 59 for(i=0; i<3; i++) //交换 60 { 61 s2=s1; 62 s2.num[i]=s1.num[i+1]; 63 s2.num[i+1]=s1.num[i]; 64 s2.s=s1.s+1; 65 if(!ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]) 66 { 67 ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]=1; 68 q.push(s2); 69 } 70 } 71 } 72 } 73 74 int main() 75 { 76 int T,i,j; 77 char ch1[5],ch2[5]; 78 scanf("%d",&T); 79 while(T--) 80 { 81 scanf("%s %s",ch1,ch2); //输入两个字符串 82 for(i=0; i<4; i++) 83 { 84 fs.num[i]=ch1[i]-‘0‘; //将其转换为4个数字记录到数组中 85 fe.num[i]=ch2[i]-‘0‘; 86 } 87 memset(ha,0,sizeof(ha)); 88 BFS(); 89 } 90 return 0; 91 }
标签:
原文地址:http://www.cnblogs.com/pshw/p/4757113.html