HDU_1072_Nightmare题解
題目意思:此時(shí)你身在錯(cuò)綜復(fù)雜滴迷宮中,你身上帶了個(gè)定時(shí)炸彈,問你能不能從原點(diǎn)到出口,如果可以,輸出最小步數(shù),否者輸出-1。
條件:
1、迷宮可以用二維數(shù)組表示
2、你可以走上,下,左,右4個(gè)方向,每次走一格
3、如果你抵達(dá)出口的時(shí)候,定時(shí)炸彈時(shí)間已經(jīng)為0了,那么你還是悲劇滴被炸死了T^T
4、如果你到達(dá)一個(gè)充滿神奇魔法的地方,你的定時(shí)炸彈會(huì)重新設(shè)置時(shí)間為6
5、不管多少次到達(dá)那個(gè)充滿神奇魔法的地方,你的定時(shí)炸彈都可以重新設(shè)置時(shí)間為6
6、如果你到達(dá)那個(gè)充滿神奇魔法的地方時(shí),定時(shí)炸彈時(shí)間已經(jīng)為0了,那么恭喜你,你飛仙化羽了~ ~
map:
如果map[i][j]==0,則這個(gè)點(diǎn)為墻壁
如果map[i][j]==1,則這個(gè)點(diǎn)為可行的路
如果map[i][j]==2,則這個(gè)點(diǎn)為起始坐標(biāo);
如果map[i][j]==3,則這個(gè)點(diǎn)為出口坐標(biāo)
如果map[i][j]==4,則這個(gè)點(diǎn)為充滿神奇魔法的地方
思路:最短路徑?——》BFS
Very important:題目規(guī)定我們每次到達(dá)充滿神奇魔法的地方,時(shí)間都可以重新設(shè)置,那么我們是不是每次都要重新設(shè)置呢,答案是否定的。試想,BFS是求最短路徑的,如果前面已經(jīng)有更短的路徑到達(dá)過(guò)充滿神奇魔法的地方,并且重新設(shè)置過(guò)時(shí)間,這次就不必了吧~也就是第一次使用完重新設(shè)置時(shí)間的權(quán)利,map[i][j]更新為1,我們不需要它滴魔法了^ ^.
BFS出口:越界?墻壁?炸彈剩余時(shí)間小于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起始坐標(biāo),ex、ey出口坐標(biāo) int go[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //上、下、左、右四個(gè)方向 struct point {int x,y,time,step;point (int a,int b,int c,int d) //省時(shí)滴構(gòu)造函數(shù)^ ^ {x=a,y=b,time=c,step=d;} }; int bfs() {point f(sx,sy,6,0);queue<point> Q;Q.push(f); //把起點(diǎn)加入隊(duì)列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; //如果下一個(gè)點(diǎn)違背條件,則不必放入隊(duì)列了if(nx==ex&&ny==ey) return s.step+1; //如果下一個(gè)點(diǎn)的坐標(biāo)剛好是出口坐標(biāo),哈哈,你成功逃脫了int times=s.time-1;if(map[nx][ny]==4){ map[nx][ny]=1; times=6;} //讓這個(gè)充滿魔法的地方失去魔法吧point tt(nx,ny,times,s.step+1);Q.push(tt); //當(dāng)前地點(diǎn)加入隊(duì)列 }}return -1; //如果無(wú)法從出口逃脫~ } 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) //尋找起始坐標(biāo) {sx=i,sy=j;}else if(k==3) //尋找出口坐標(biāo) {ex=i,ey=j;}}printf("%d\n",bfs());}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/A-way/archive/2013/04/24/3039995.html
總結(jié)
以上是生活随笔為你收集整理的HDU_1072_Nightmare题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pptp client
- 下一篇: 鼻骨矫正后遗症