POJ - 1475 Pushing Boxes(bfs套bfs)
生活随笔
收集整理的這篇文章主要介紹了
POJ - 1475 Pushing Boxes(bfs套bfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:要求模擬推箱子游戲的過程,輸出最優路徑,最優路徑要求箱子移動的次數最少,次為人移動的次數最少
題目分析:這個題可以簡化成兩個相互依附的東西同時走迷宮,因為首先要求箱子移動的次數最少,所以我們在最外層設置一層bfs用來搜索箱子的最優解,其次是要求人的移動次數最少,我們可以在內層設置一個BFS用來搜索人的最優解,這樣的時間復雜度是n*n*m*m,題目給出的n和m最大為20,20的四次方也才160000,內存和時間都合適
注意一下,這個題目沒有那么多坑,每個地圖中只有一個箱子,一個起點,一個終點,我看網上有人嵌套bfs時用了一個四位vis來記錄狀態,我感覺沒那個必要,就只是開了兩個二維的vis和book分別記錄箱子的狀態和人的狀態,可以達到同樣的效果,其次就是需要注意一下,當進入人的BFS時,箱子所在的那一格需要視為墻,我們只需要在搜索之前將箱子所在的那一格的狀態設置為true即可,還有就是路徑記錄問題,因為數據量比較小,我直接用string暴力傳遞的,因為模擬鏈表真的有點燒腦子嗷嗷嗷,目前就被一個題目卡了內存,其他的題目還是可以直接用string或vector暴力傳遞滴
思路清晰點寫一遍能調過樣例肯定就沒問題了,上代碼吧:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=25;const int b[4][2]={0,1,0,-1,1,0,-1,0};const char man[4]={'e','w','s','n'};const char box[4]={'E','W','S','N'};int n,m;string ans,str;char maze[N][N];bool vis[N][N],book[N][N];bool check(int x,int y) {if(x<0||y<0||x>=n||y>=m)return false;if(maze[x][y]=='#')return false;return true; }struct Node {int x,y,bx,by;string path;Node(int X,int Y,int BX,int BY,string PATH){x=X;y=Y;bx=BX;by=BY;path=PATH;}Node(){} };bool BFS(int x,int y,int xxx,int yyy,int px,int py)//搜索人的路徑,簡單bfs //上述六個參數分別代表:起點x,起點y,終點x,終點y,箱子x,箱子y {memset(book,false,sizeof(book));//記得初始化queue<Node>q;q.push(Node(x,y,0,0,""));book[x][y]=true;book[px][py]=true;//記得將箱子坐標的狀態設為truewhile(!q.empty()){Node cur=q.front();q.pop();if(cur.x==xxx&&cur.y==yyy){str=cur.path;return true;}for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];if(!check(xx,yy))continue;if(book[xx][yy])continue;book[xx][yy]=true;q.push(Node(xx,yy,0,0,cur.path+man[i]));}}return false; }bool bfs()//搜索箱子的路徑,稍微多了幾個條件的bfs {memset(vis,false,sizeof(vis));//記得初始化Node temp;temp.path="";for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(maze[i][j]=='B'){temp.bx=i;temp.by=j;}else if(maze[i][j]=='S'){temp.x=i;temp.y=j;}queue<Node>q;q.push(temp);while(!q.empty()){Node cur=q.front();q.pop();if(maze[cur.bx][cur.by]=='T'){ans=cur.path;return true;}for(int i=0;i<4;i++)//模擬推箱子的過程{int xx=cur.bx+b[i][0];//計算箱子應到達的位置int yy=cur.by+b[i][1];if(!check(xx,yy))//檢查坐標合理性continue;int xxx=cur.bx-b[i][0];//計算人應到達的位置int yyy=cur.by-b[i][1];if(!check(xxx,yyy))//檢查坐標合理性continue;if(vis[xx][yy])continue;if(!BFS(cur.x,cur.y,xxx,yyy,cur.bx,cur.by))//計算人能否到達continue;vis[xx][yy]=true;q.push(Node(cur.bx,cur.by,xx,yy,cur.path+str+box[i]));//若能到達更新狀態}}return false; }int main() { // freopen("input.txt","r",stdin);int kase=0;while(scanf("%d%d",&n,&m)!=EOF&&n+m){for(int i=0;i<n;i++)scanf("%s",maze[i]);printf("Maze #%d\n",++kase);if(bfs())cout<<ans<<endl<<endl;elsecout<<"Impossible."<<endl<<endl;}return 0; }?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的POJ - 1475 Pushing Boxes(bfs套bfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 3322 Bloxorz I
- 下一篇: POJ - 3635 Full Tank