hdu 1252 BFS


  1 /*
2 题意:给出一个m*m矩阵表示的完全图,且每个点都有自环,每条边都有一种颜色;有三个玩家ABC的三张纸片分别初始在
3 某三个位置(可以重叠),纸片可以沿着边走一步,可以走的路径的规则为:若A要走到某个点i,则A-i的颜色要和B-C的颜
4 色相同;问最少要走多少步。(题意太难懂了,看了别人的说明才弄懂了题意)
5
6 题解:BFS
7 首先初步分析题意似乎很难用图论来解决,那么就是搜索/DP/数据结构,然后从搜索方面去思考的话,就是要找状态,然
8 后初步列出所有信息,三个点得位置以及步长的,其中要求的是最短步长,一般求最短的距离当然会首先想到BFS,然后
9 就可以想到,到达同一个位置可以有不同的步长,而BFS保证了步长最短,那么就再通过其他的东西来保证三个点的位置
10 状态不重复即可,那样显然就会想到一个vis[][][]去记录,而且50*50*50的空间完全够,而且步长的变化是+1的变化,
11 因此可以一点点的+1从而逐渐找到最短路径,由于是BFS,因此每一次搜索到某个点已经保证该位置状态已经是最优。
12 */
13 #include <cstdio>
14 #include <cstring>
15 #include <algorithm>
16
17 bool vis[55][55][55];
18 char gra[55][55];
19
20 struct node
21 {
22 int p1,p2,p3;
23 int step;
24 }Q[150000];
25 int front,tail;
26
27 int bfs(int n, node now)
28 {
29 memset(vis,false,sizeof(vis));
30 front = tail = 0;
31 now.step = 0;
32 Q[tail++] = now;
33 vis[now.p1][now.p2][now.p3] = true;
34 while (front < tail)
35 {
36 now = Q[front++];
37 int p1 = now.p1, p2 = now.p2, p3 = now.p3;
38 if (p1 == p2 && p2 == p3)
39 return now.step;
40 node tmp = now;
41 tmp.step++;
42 for(int i=0; i<n; i++)
43 {
44 // 判断边是否能走,已经是否已经访问
45 if (gra[p1][i] == gra[p2][p3] && !vis[i][p2][p3])
46 {
47 tmp.p1 = i;
48 Q[tail++] = tmp;
49 vis[i][p2][p3] = true;
50 }
51 }
52
53 tmp = now;
54 tmp.step++;
55 for(int i=0; i<n; i++)
56 {
57 if (gra[p2][i] == gra[p1][p3] && !vis[p1][i][p3])
58 {
59 tmp.p2 = i;
60 Q[tail++] = tmp;
61 vis[p1][i][p3] = true;
62 }
63 }
64
65 tmp = now;
66 tmp.step++;
67 for(int i=0; i<n; i++)
68 {
69 if (gra[p3][i] == gra[p1][p2] && !vis[p1][p2][i])
70 {
71 tmp.p3 = i;
72 Q[tail++] = tmp;
73 vis[p1][p2][i] = true;
74 }
75 }
76 }
77 return -1;
78 }
79
80 int main(void)
81 {
82 int n;
83 while (~scanf("%d",&n) && n)
84 {
85 node start;
86 scanf("%d%d%d%*c",&start.p1,&start.p2,&start.p3);
87 start.p1--;
88 start.p2--;
89 start.p3--;
90 char s[105];
91 for(int i=0; i<n; i++)
92 {
93 gets(s);
94 for(int j=0; j<n; j++)
95 gra[i][j] = s[j*2];
96 }
97 int ans = bfs(n,start);
98 if (ans < 0)
99 printf("impossible\n");
100 else
101 printf("%d\n",ans);
102 }
103 return 0;
104 }

hdu 1252 BFS,布布扣,bubuko.com

时间: 2024-10-23 06:51:29

hdu 1252 BFS的相关文章

hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

HDU 1072 bfs

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7083    Accepted Submission(s): 3409 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a tim

hdu 4707 bfs

bfs基础算法水题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue> using namespace std; const int Max = 1e5+50; int dist[Max]; vector<int> t

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

hdu 1226 BFS + bfs记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1226 为了省空间,可以用vis数组初始化的时候初始化为-1, 发现一个BFS容易错的地方 开始一直WA在这里:就是我int tp=q.front();之后马上q.pop():了,然后才去判断是不是符合条件以break,这样就不能根据q.empty()==1认为没有找到ans 因为这里WA了 其实也可以vis[0] == -1来判断 比较不理解的是 当n==0的时候 %n==0的时候怎么处理 //#pragma

hdu 5025 BFS + 优化 广东区域赛网赛

http://acm.hdu.edu.cn/showproblem.php?pid=5025 TLE了好几次 写的时候,问题在于, 1.钥匙怎么处理 参考了他人的写法,vis[key_num][i][j],相当于将图多维化,这样就可以判重了,否则只是按照普通的BFS,钥匙数不同的时候,可以重复,这个代码难易表达出来 另外此处一个很好的优化,当cost_now<cost[key_now][x_now][y_now]的时候,才q.push(Node)  这个剪枝很好啊 2.蛇怎么处理 没蛇的话,第一

hdu 1430 (BFS 康托展开 或 map )

第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个wa算了. 然后卡着了,后来上网上搜了,要用康托展开,康托展开是什么鬼?然后学习了一下,就是个映射,感觉和map差不多. http://blog.csdn.net/zhongkeli/article/details/6966805这个学习一下康托展开. 其实本题的关键不是康托展开,而是置换. 以12

hdu 1072(BFS) 有炸弹

http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意是在一个n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重启器. 定时炸弹的时间是6,人走一步所需要的时间是1.每次可以上.下.左.右移动一格. 当人走到4时如果炸弹的时间不是0,可以重新设定炸弹的时间为6.如果人走到3而炸弹的时间不为0时, 成功走出.求人从2走到3的最短时间. 一道典型的搜索,用的bfs,结构体中开一个step表示要求的时间,也就相当于步数,一个