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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

HDU_1072_Nightmare题解

發(fā)布時(shí)間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU_1072_Nightmare题解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目意思:此時(shí)你身在錯(cuò)綜復(fù)雜滴迷宮中,你身上帶了個(gè)定時(shí)炸彈,問(wèn)你能不能從原點(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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。