题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1026
题目大意:就是说给你一个8数码,问你能够达到的距离最远的状态是什么。
刚开始以为只要顺着一边走就行了,后来发现这样走可能最远到达的状态也能通过其他方式到达。
在这里WA了好多次。
应该把所有可能出现的情况全都枚举出来,然后判重。。
UVA也真是慢。。4s的代码跑了快4分钟。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <map> 7 #include <set> 8 #include <queue> 9 #include <string> 10 using namespace std; 11 typedef unsigned long long ull; 12 13 const int B = 10; 14 15 struct Node{ 16 int status[3][3]; 17 int h; 18 int x,y; 19 string route; 20 }; 21 22 int T; 23 int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 24 25 26 int main(){ 27 scanf("%d",&T); 28 for(int t=1;t<=T;t++){ 29 Node s; 30 s.h = 0; 31 set<int> se; 32 for(int i=0;i<3;i++){ 33 for(int j=0;j<3;j++){ 34 scanf("%d",&s.status[i][j]); 35 s.h = s.h*10+s.status[i][j]; 36 if( s.status[i][j] == 0){ 37 s.x = i; s.y = j; 38 } 39 } 40 } 41 se.insert(s.h); 42 // printf("%d\n",s.h); 43 s.route = ""; 44 queue<Node> q; 45 q.push(s); 46 Node ans = s; 47 bool fl = true; 48 while(!q.empty()){ 49 Node tn = q.front(); q.pop(); 50 if( fl || ans.route.size()<tn.route.size()) ans = tn; 51 for(int i=0;i<4;i++){ 52 Node t = tn; 53 int dx = t.x+dir[i][0], dy = t.y+dir[i][1]; 54 if( dx<=2&&dx>=0&&dy<=2&&dy>=0 ){ 55 swap(t.status[tn.x][tn.y],t.status[dx][dy]); 56 t.x = dx; t.y = dy; 57 int tt = 0; 58 for(int i=0;i<3;i++){ 59 for(int j=0;j<3;j++){ 60 tt = tt*B+t.status[i][j]; 61 } 62 } 63 t.h = tt; 64 65 if( i==0 ) t.route = tn.route+"D"; 66 else if( i==1 ) t.route = tn.route+"U"; 67 else if( i==2 ) t.route = tn.route+"R"; 68 else if( i==3 ) t.route = tn.route+"L"; 69 if( se.find(tt)==se.end() ){ 70 se.insert(tt); 71 q.push(t); 72 } 73 } 74 } 75 } 76 printf("Puzzle #%d\n",t); 77 for(int i=0;i<3;i++) for(int j=0;j<3;j++){ 78 printf(j==2?"%d\n":"%d ",ans.status[i][j]); 79 } 80 puts(ans.route.c_str()); 81 puts(""); 82 } 83 return 0; 84 }
时间: 2024-10-22 12:51:20