[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 }
时间: 2024-10-22 12:51:20

[Uva 10085] The most distant state (BFS)的相关文章

uva10085 The most distant state(BFS)

Problem A The Most Distant State Input: standard input Output: standard output The 8-puzzle is a square tray in which eight square tiles are placed. The remaining ninth square is uncovered. Each tile has a number on it. A tile that is adjacent to the

UVA 10085(bfs+康拓展开)八数码问题

Description Problem A The Most Distant State Input: standard input Output: standard output The 8-puzzle is a square tray in which eight square tiles are placed. The remaining ninth square is uncovered. Each tile has a number on it. A tile that is adj

UVA The most distant state

题目如下: Problem A The Most Distant State Input: standard input Output: standard output The 8-puzzle is a square tray inwhich eight square tiles are placed. The remaining ninth square is uncovered.Each tile has a number on it. A tile that is adjacent to

UVA 816 - Abbott&#39;s Revenge(BFS)

UVA 816 - Abbott's Revenge 题目链接 题意:一个迷宫,每个点限制了从哪一方向来的,只能往左右前走,然后问起点到终点的最短路径 思路:BFS,每个点拆成4个方向的点,对应能走的方向建图跑一下bfs即可 代码: #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace

uva 10603 Fill(倒水问题 BFS)

貌似uva崩了,现在进不去,所以这道题还判断正确与否,其实无所谓了,我这是看的网上的代码,写的基本上一样,唉,没办法,不会做,又看了网上的题解,认真写理解吧还是... 构造了一个结构体,water数组用来保存三个杯子的状态,sum用来保存当前的倒水量,visit数组用来保存状态,以 防他们重复访问,三个杯子只需要两个杯子来判断,第三个已经确定,所以开一个二维数组就可以了...然后用 reach数组来存储所有的倒水量,下标是目标水量,值是一共的倒水量... 只需要一次BFS最多有200*200种状

UVa 439骑士的移动(BFS)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=380 做了这道题之后对BFS总算是有了点认识了. 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 int map[10][10]; 6 typedef struct node 7

uva 11624 Fire!(多源BFS)

uva 11624 Fire! 题目大意:J在迷宫里工作,有一天迷宫起火了,火源有多处.每过一秒,火源都会向四个方向蔓延,J也会向四个方向移动,问J能不能跑出去,能的话输出他跑出去的最短时间,否则输出"IMPOSSIBLE" 解题思路:先进行一次BFS,找出每一点火焰蔓延到该处的最短时间.然后根据这张"火势图",对J的行进路线进行BFS.注意J在边缘的时候,以及没有火源的时候. #include <cstdio> #include <cstring

UVa 816 Abbott的复仇(BFS)

寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同,允许出去的方向也不同.所以在记录迷宫的时候比较麻烦,可以用一个四元组has_edge[10][10][4][4]来记录,前两个元素代表坐标点,第三个元素代表进入该点时的方向,第四个元素代表离开该点时的方向.在BFS遍历时还是和以前的题目差不多的,记录好路径,最后回溯输出就行. 我还犯了个小错误,因为

UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

https://vjudge.net/problem/UVA-1599 给一个n个点m条边(2<=n<=100000,1<=m<=200000)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对结点可能有多条边,一条边可能连接相同的结点(自环).输入保证结点1可以到达结点n.颜色是1~10^9的整数. 分析: 从题目中我们可以看出,题目中的无向图是可以出现自环和重边的,自环我们可以在输入的时候检查并排