2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
生活随笔
收集整理的這篇文章主要介紹了
2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 /*
2 這是我做過的一道新類型的搜索題!從來沒想過用四維數(shù)組記錄狀態(tài)!
3 以前做過的都是用二維的!自己的四維還是太狹隘了.....
4
5 題意:悟空救師傅 ! 在救師父之前要先把所有的鑰匙找到!
6 每種鑰匙有 k 種, 每一種有多個! 只要求找到每一種的其中一個就可以!
7 找鑰匙的順序按照 第1種, 第2種, 第3種 ....第k種!
8 找鑰匙的時間是一步, 走到相鄰空地的時間是一步, 打蛇的時間就是兩步!
9 求找到師傅的最少步數(shù)!
10
11 這里說一下 state[N][N][10][35]表示的含義: ->state[x][y][i][j]
12 前兩維就不用說了,就是地圖上的坐標(biāo), 第三維表示的是當(dāng)前找到第幾把鑰匙
13 第四維表示的沿著一條路徑走到 (x, y)找到 第 i 把鑰匙打掉了哪幾條蛇!
14 將 j 拆分成 二進制, 從右往左數(shù), 如果第 k 為是1, 表示第 k 條 蛇殺掉了!
15 */
16
17 #include<iostream>
18 #include<cstdio>
19 #include<cstring>
20 #include<algorithm>
21 #include<queue>
22
23 #define N 105
24 using namespace std;
25
26 char mp[105][105];
27
28 bool state[N][N][10][35];
29
30 int bx, by;
31
32 struct node{
33 int x, y;
34 int numk, snk;
35 int step;
36 node(){}
37
38 node(int x, int y, int numk, int snk, int step){
39 this->x = x;
40 this->y = y;
41 this->numk = numk;
42 this->snk = snk;
43 this->step = step;
44 }
45 };
46
47 int n, m;
48 int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
49 bool operator < (node a, node b) {
50 return a.step > b.step;
51 }
52
53 priority_queue<node>q;
54
55 bool bfs(){
56 while(!q.empty()) q.pop();
57 memset(state, false, sizeof(state));
58 q.push( node(bx, by, 0, 0, 0) );
59 state[bx][by][0][0] = true;
60 while( !q.empty() ) {
61 node cur = q.top();
62 q.pop();
63 for(int i=0; i<4; ++i){
64 int x = cur.x + dir[i][0];
65 int y = cur.y + dir[i][1];
66 if(x<1 || x>n || y<1 || y>n || mp[x][y]=='#') continue;
67 int numk = cur.numk, snk = cur.snk, step = cur.step;
68 if(mp[x][y] == '.')
69 step += 1;
70 else if( mp[x][y] >= '1' && mp[x][y] <= '9'){
71 if( numk + 1 == mp[x][y] - '0' )
72 numk += 1;
73 step += 1;
74 }
75 else if( mp[x][y] >= 'A' && mp[x][y] <= 'E' ){//這一步是關(guān)鍵
76 int cnt = mp[x][y] - 'A' + 1;
77 if( (1 << (cnt-1) ) & snk ) step += 1;//如果這一條蛇已經(jīng)被打過了,也就是一條路又折回到這一個點
78 else{//在這一條路上,這條蛇沒有被打過,那就將它打掉,并標(biāo)記這條蛇打過了!
79 step += 2;
80 snk ^= ( 1 << (cnt-1) );
81 }
82 }
83 else if( mp[x][y] == 'T' && numk == m ){
84 printf("%d\n", step + 1);
85 return true;
86 }
87 else step += 1;
88
89 if( state[x][y][numk][snk] ) continue;
90 state[x][y][numk][snk] = true;
91 q.push( node(x, y, numk, snk, step) );
92 }
93 }
94 return false;
95 }
96
97 int main(){
98 while( scanf("%d%d", &n, &m) && (n ||m) ) {
99 int cntS = 0;
100 for(int i = 1; i <= n; ++ i){
101 scanf("%s", mp[i] + 1);
102 for(int j = 1; j <=n; ++ j)
103 if(mp[i][j] == 'K'){
104 bx = i;
105 by = j;
106 }
107 else if(mp[i][j] == 'S')
108 mp[i][j] = 'A' + cntS++;
109 }
110 if( !bfs() ) printf("impossible\n");
111 }
112 return 0;
113 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/3984954.html
總結(jié)
以上是生活随笔為你收集整理的2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装饰新家教程?
- 下一篇: (九)linux中断编程