日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

發布時間:2025/3/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /* 2 這是我做過的一道新類型的搜索題!從來沒想過用四維數組記錄狀態! 3 以前做過的都是用二維的!自己的四維還是太狹隘了..... 4 5 題意:悟空救師傅 ! 在救師父之前要先把所有的鑰匙找到! 6 每種鑰匙有 k 種, 每一種有多個! 只要求找到每一種的其中一個就可以! 7 找鑰匙的順序按照 第1種, 第2種, 第3種 ....第k種! 8 找鑰匙的時間是一步, 走到相鄰空地的時間是一步, 打蛇的時間就是兩步! 9 求找到師傅的最少步數! 10 11 這里說一下 state[N][N][10][35]表示的含義: ->state[x][y][i][j] 12 前兩維就不用說了,就是地圖上的坐標, 第三維表示的是當前找到第幾把鑰匙 13 第四維表示的沿著一條路徑走到 (x, y)找到 第 i 把鑰匙打掉了哪幾條蛇! 14 將 j 拆分成 二進制, 從右往左數, 如果第 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' ){//這一步是關鍵 76 int cnt = mp[x][y] - 'A' + 1; 77 if( (1 << (cnt-1) ) & snk ) step += 1;//如果這一條蛇已經被打過了,也就是一條路又折回到這一個點 78 else{//在這一條路上,這條蛇沒有被打過,那就將它打掉,并標記這條蛇打過了! 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 }

?

轉載于:https://www.cnblogs.com/hujunzheng/p/3984954.html

總結

以上是生活随笔為你收集整理的2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。