1. 程式人生 > >BFS:noi6044鳴人與佐助

BFS:noi6044鳴人與佐助

span col cstring str 基本 數組 左右 初始 ges

PS:一道XX到我心態崩潰的好(傻逼)題。

先粘題目:

佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?

技術分享

已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每一個單位的查克拉可以打敗一個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動一個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?

輸入輸入的第一行包含三個整數:M,N,T。代表M行N列的地圖和鳴人初始的查克拉數量T。0 < M,N < 200,0 ≤ T < 10
後面是M行N列的地圖,[email protected],+代表佐助。*代表通路,#代表大蛇丸的手下。輸出輸出包含一個整數R,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。樣例輸入

樣例輸入1
4 4 1
#@##
**##
###+
****

樣例輸入2
4 4 2
#@##
**##
###+
****

樣例輸出

樣例輸出1
6

樣例輸出2
4

先寫一下心路歷程吧。

還是一道典型迷宮,唯一的新穎是查克拉的加入。

首先,我寫出基本的迷宮框架。

一開始判斷查克拉的辦法稍有復雜,借鑒了網上大佬的方法,依舊通過一個數組來判斷查克拉。

別的地方沒有太大的更新了,貼代碼吧:

#include<cstdio>
#include<cstdlib>
#include<cstring>
int u[4]={1,-1,0,0},p[4]={0,0,1,-1};
int n,m,w,xz,yz,h,l;
bool vis[210][210][20];
char b[210][210];
struct mmap{int dis,cha,x,y;};
mmap q[400100];
void doit(){
    
int i,x,y,head=0,tail=1; q[1].x=h; q[1].y=l; q[1].cha=w; q[1].dis=0; while(head<tail) { head++; for(i = 0 ; i < 4 ; ++i){ x=u[i]+q[head].x; y=p[i]+q[head].y; if(x<=0||x>m||y<=0||y>n||((!q[head].cha)&&(b[x][y]==#))||!(vis[x][y][q[head].cha]))continue; tail++; q[tail].x =x; q[tail].y =y; q[tail].dis=q[head].dis+1; q[tail].cha=q[head].cha; if(b[x][y]==#)q[tail].cha--; vis[x][y][q[tail].cha]=false; if(x==xz&&y==yz){ printf("%d",q[tail].dis); return ; } } } printf("-1"); } int main(){ memset(vis,true,sizeof(vis)); scanf("%d %d %d",&m,&n,&w); for(int i = 1 ; i <= m ; ++i){ scanf("%s",b[i]+1); for(int j = 1 ; j <= n ; ++j){ if(b[i][j]==@){ h=i; l=j; } if(b[i][j]==+){ xz=i; yz=j; } } } doit(); return 0; }

關於這道題就是這樣了,下面,總結一下吧。

最近比較浮躁,靜不下心,不停地提交提交,也沒有仔細看看代碼。之前一直在RE,於是一直檢查數組,沒看出錯誤。RE了好幾次決定靜下心看看代碼,發現在還沒有改變查克拉的時候就改變了vis查克拉。這是第一個錯誤。

之後再測評就一直5分,尋找最後一分錯在哪裏(滿分6分)。仔細研究正確代碼後發現,自己的數組開小了。雖然地圖最大200*200,但是每一個點的查克拉最多有10種出現情況,也就是說,在用結構體時,每一個位置可能占用10個房間,那麽一共便需要400000個房間。

這道題用了大量的時間,但也還值得,有很多收獲:

結構體在搜索中的優勢非常明顯,可以更加簡單明了;

也給自己一個很慘的教訓:在以後,無論是做什麽事,都要靜下心來慢慢分析,太浮躁的結果只能是既花費時間,又沒有太大收獲。

以後我會牢牢記住這一點的。

那麽,再次打起精神來,投入接下來的戰鬥吧!

傅遠植 加油!!!!

2017.5.21

BFS:noi6044鳴人與佐助