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