【HDOJ】1429 胜利大逃亡(续)

BFS+状态压缩,做了很多状态压缩了。今晚把八数码问题给搞定了。


 1 #include <iostream>
2 #include <queue>
3 #include <cstring>
4 #include <cstdio>
5 using namespace std;
6
7 typedef struct node_st {
8 int x, y, t;
9 int key;
10 node_st() {}
11 node_st(int xx, int yy, int tt, int kk) {
12 x = xx; y = yy; t = tt; key = kk;
13 }
14 } node_st;
15
16 char map[25][25];
17 char visit[1<<10][25][25];
18 int direct[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
19 int n, m, time;
20
21 int bfs(int bx, int by) {
22 int x, y, key, t;
23 int i, tmp;
24 queue<node_st> que;
25 node_st node;
26
27 memset(visit, 0, sizeof(visit));
28 visit[bx][by][0] = 1;
29 que.push(node_st(bx,by,0,0));
30
31 while ( !que.empty() ) {
32 node = que.front();
33 if (node.t >= time)
34 return -1;
35 if (map[node.x][node.y] == ‘^‘)
36 return node.t;
37 que.pop();
38 t = node.t + 1;
39 for (i=0; i<4; ++i) {
40 x = node.x + direct[i][0];
41 y = node.y + direct[i][1];
42 if (x<0 || x>=n || y<0 || y>=m)
43 continue;
44 if (map[x][y]>=‘a‘ && map[x][y]<=‘j‘)
45 key = node.key | (1<<(map[x][y]-‘a‘));
46 else
47 key = node.key;
48 if (visit[key][x][y] || map[x][y]==‘*‘)
49 continue;
50 if (map[x][y]>=‘A‘ && map[x][y]<=‘J‘) {
51 tmp = (1<<(map[x][y]-‘A‘)) & key;
52 if ( !tmp )
53 continue;
54 }
55 que.push(node_st(x,y,t,key));
56 visit[key][x][y] = 1;
57 }
58 }
59
60 return -1;
61 }
62
63 int main() {
64 int bx, by;
65 int i, j;
66
67 while (scanf("%d %d %d", &n, &m, &time) != EOF) {
68 for (i=0; i<n; ++i) {
69 scanf("%s", map[i]);
70 for (j=0; j<m; ++j) {
71 if (map[i][j] == ‘@‘) {
72 bx = i;
73 by = j;
74 }
75 }
76 }
77 i = bfs(bx, by);
78 printf("%d\n", i);
79 }
80
81 return 0;
82 }

时间: 2024-10-18 02:52:36

【HDOJ】1429 胜利大逃亡(续)的相关文章

hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】

题目:hdoj 1429 胜利大逃亡(续) 相同题目: 题意:中文的,自己看 分析:题目是求最少的逃亡时间,确定用BFS 这个题目的难点在于有几个锁对于几把钥匙,唯一的对应关系,不能用直接的标记法,因为一个图可能需要搜索多次. 仔细分析的话会发现,图的搜索次数是和钥匙的出现次数相关,那么我们可以用二进制的0 和 1 来表示第几把钥匙出现过没有,所以我们可以用状态压缩来标记那个钥匙出现过,然后用三维标记,第三维表示出现几个钥匙了的情况下图的点的搜索情况.其他就和简单的一样. AC代码: #incl

HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑一般的搜索问题的解答思路: 搜索算法即在解空间中搜索满足要求的答案,可以看做一棵不断生长的状态树,状态之间不断扩展出新的状态,直到找出所需要的状态,即答案: <1>定义状态:对于该问题,由于存在门与锁的约束条件,所以状态应该包括3个元素,即人所在的坐标 x 和 y 以及含有锁的种类: <2&

HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10648    Accepted Submission(s): 3860 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王

HDOJ 题目1429 胜利大逃亡(续)(BFS)

New! 关于举办校第十五届程序设计竞赛暨2015省赛集训队选拔赛的通知 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5811    Accepted Submission(s): 2027 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次

HDU 1429 胜利大逃亡(续)(bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6270    Accepted Submission(s): 2177 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了

hdu 1429 胜利大逃亡(续)(bfs+位压缩)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7346    Accepted Submission(s): 2546 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

hdu 1429 胜利大逃亡(续)【广度优先搜索+状态压缩】

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5411    Accepted Submission(s): 1863 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了

hdu 1429 胜利大逃亡(续) 搜索+状态压缩,,不错的题。

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5860    Accepted Submission(s): 2046 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了

HDU 1429胜利大逃亡(续) (bfs+状态压缩)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6469 Accepted Submission(s): 2243 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)-- 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥

hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6070    Accepted Submission(s): 2096 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带