HDU_1072_Nightmare题解
題目意思:此時你身在錯綜復雜滴迷宮中,你身上帶了個定時炸彈,問你能不能從原點到出口,如果可以,輸出最小步數,否者輸出-1。
條件:
1、迷宮可以用二維數組表示
2、你可以走上,下,左,右4個方向,每次走一格
3、如果你抵達出口的時候,定時炸彈時間已經為0了,那么你還是悲劇滴被炸死了T^T
4、如果你到達一個充滿神奇魔法的地方,你的定時炸彈會重新設置時間為6
5、不管多少次到達那個充滿神奇魔法的地方,你的定時炸彈都可以重新設置時間為6
6、如果你到達那個充滿神奇魔法的地方時,定時炸彈時間已經為0了,那么恭喜你,你飛仙化羽了~ ~
map:
如果map[i][j]==0,則這個點為墻壁
如果map[i][j]==1,則這個點為可行的路
如果map[i][j]==2,則這個點為起始坐標;
如果map[i][j]==3,則這個點為出口坐標
如果map[i][j]==4,則這個點為充滿神奇魔法的地方
思路:最短路徑?——》BFS
Very important:題目規定我們每次到達充滿神奇魔法的地方,時間都可以重新設置,那么我們是不是每次都要重新設置呢,答案是否定的。試想,BFS是求最短路徑的,如果前面已經有更短的路徑到達過充滿神奇魔法的地方,并且重新設置過時間,這次就不必了吧~也就是第一次使用完重新設置時間的權利,map[i][j]更新為1,我們不需要它滴魔法了^ ^.
BFS出口:越界?墻壁?炸彈剩余時間小于2了?
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stdlib.h> #include<queue> using namespace std; int map[10][10],n,r,c,sx,sy,ex,ey; //map迷宮哈,sx、sy起始坐標,ex、ey出口坐標 int go[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //上、下、左、右四個方向 struct point {int x,y,time,step;point (int a,int b,int c,int d) //省時滴構造函數^ ^ {x=a,y=b,time=c,step=d;} }; int bfs() {point f(sx,sy,6,0);queue<point> Q;Q.push(f); //把起點加入隊列while(!Q.empty()){point s=Q.front();Q.pop();for(int i=0;i<4;++i){int nx=s.x+go[i][0];int ny=s.y+go[i][1];if(!map[nx][ny]||s.time<2||nx>=r||nx<0||ny>=c||ny<0) continue; //如果下一個點違背條件,則不必放入隊列了if(nx==ex&&ny==ey) return s.step+1; //如果下一個點的坐標剛好是出口坐標,哈哈,你成功逃脫了int times=s.time-1;if(map[nx][ny]==4){ map[nx][ny]=1; times=6;} //讓這個充滿魔法的地方失去魔法吧point tt(nx,ny,times,s.step+1);Q.push(tt); //當前地點加入隊列 }}return -1; //如果無法從出口逃脫~ } int main() {int i,j,k;cin>>n;while(n--){scanf("%d%d",&r,&c);for(i=0;i<r;++i)for(j=0;j<c;++j){scanf("%d",&k);map[i][j]=k;if(k==2) //尋找起始坐標 {sx=i,sy=j;}else if(k==3) //尋找出口坐標 {ex=i,ey=j;}}printf("%d\n",bfs());}return 0; }轉載于:https://www.cnblogs.com/A-way/archive/2013/04/24/3039995.html
總結
以上是生活随笔為你收集整理的HDU_1072_Nightmare题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pptp client
- 下一篇: 解析json获取天气信息(中央气象台)