BFS:noi6044鳴人與佐助
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鳴人與佐助