首页 > 代码库 > [Uva 10085] The most distant state (BFS)

[Uva 10085] The most distant state (BFS)

题目链接: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 }

 

[Uva 10085] The most distant state (BFS)