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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BFS+状态压缩 hdu-1885-Key Task

發布時間:2025/1/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BFS+状态压缩 hdu-1885-Key Task 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=1885

題目意思:

給一個矩陣,給一個起點多個終點,有些點有墻不能通過,有些點的位置有門,需要拿到相應顏色的鑰匙才能打開,問到達終點的最短步數。

解題思路:

BFS+狀態壓縮。

將每種顏色對應一個二進制數位,1表示已經得到該顏色的鑰匙,0表示沒有得到。

一把鑰匙可以同種顏色的多扇門。

代碼:

?

#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #define eps 1e-6 #define INF 0x1f1f1f1f #define PI acos(-1.0) #define ll __int64 #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std;/* freopen("data.in","r",stdin); freopen("data.out","w",stdout); */map<char,int>myp1,myp2;bool vis[20][110][110]; char save[110][110]; int n,m,dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};struct Point {int x,y,step,ss; }s;bool iscan(int x,int y) {if(x<1||x>n||y<1||y>m||save[x][y]=='#')return false;return true; } //一把鑰匙可以開顏色相同的多種鎖 void bfs() {memset(vis,false,sizeof(vis));s.step=0,s.ss=0;queue<Point>myq;myq.push(s);vis[0][s.x][s.y]=true;while(!myq.empty()){Point tmp=myq.front();myq.pop();int xx,yy;for(int i=0;i<4;i++){xx=tmp.x+dir[i][0],yy=tmp.y+dir[i][1];if(!iscan(xx,yy))continue;if(save[xx][yy]=='X'){printf("Escape possible in %d steps.\n",tmp.step+1);return ;}int tt=tmp.ss;if(myp1.find(save[xx][yy])!=myp1.end()) //得到一把鑰匙{tt=tt|(1<<myp1[save[xx][yy]]);if(vis[tt][xx][yy]) //該狀態之前已被訪問continue;}else if(myp2.find(save[xx][yy])!=myp2.end()){if(!(tt&(1<<myp2[save[xx][yy]]))) //沒有鑰匙continue;}if(vis[tt][xx][yy])continue;vis[tt][xx][yy]=true;Point t;t.x=xx,t.y=yy,t.ss=tt,t.step=tmp.step+1;myq.push(t);}}printf("The poor student is trapped!\n");return ; }int main() {myp1['b']=0,myp1['y']=1,myp1['r']=2,myp1['g']=3; //每種不同的顏色對應不同的數位myp2['B']=0,myp2['Y']=1,myp2['R']=2,myp2['G']=3;while(scanf("%d%d",&n,&m)&&m+n){memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++){scanf("%s",save[i]+1);for(int j=1;j<=m;j++){if(save[i][j]=='*')s.x=i,s.y=j;}}bfs();}return 0; }


?

?

總結

以上是生活随笔為你收集整理的BFS+状态压缩 hdu-1885-Key Task的全部內容,希望文章能夠幫你解決所遇到的問題。

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