poj 4115 鳴人和佐助(bfs特殊判重)

2021-08-19 19:41:35 字數 1934 閱讀 1080

總時間限制:

1000ms

記憶體限制:

65536kb

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

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

輸入輸入的第一行包含三個整數:m,n,t。代表m行n列的地圖和鳴人初始的查克拉數量t。0 < m,n < 200,0 ≤ t < 10

後面是m行n列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。

輸出輸出包含乙個整數r,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。

樣例輸入

樣例輸入14 4 1#@##**#####+****樣例輸入24 4 2#@##**#####+****

樣例輸出

樣例輸出16樣例輸出24

分析:這題非常險惡=-=。首先直接想到用bfs求最短時間。

常規思路都是bfs加乙個vis陣列判重,但這題不一樣的是它有查克拉這個屬性需要記錄。

就是說你根據不同的走法,是可以多次走同乙個點的,即乙個點並不是只能走一次。為什麼呢?因為走不同的路線,你查克拉的剩餘量可能是不一樣的。你上次走這的時候如果查克拉剩餘是n,但是你可能走另一條路再到這的時候是大於n的。這時候你到底要不要再把這個點放進去呢,答案是,如果上次的小於這次的剩餘查克拉,則可以走,因為啊,你上次走著的時候儲存的資訊在佇列的前面,你如果上次是能走到佐助那的話,程式會在執行到後一次走這之前就結束了,如果沒結束說明上次走這的時候,剩餘的查克拉不夠走到佐助,所以後一次的查克拉如果大於前一次走到這的則可以放入佇列。所以這題和普通的無條件走迷宮問題

是不一樣的。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

char a[200][200];

int ckl[200][200]; //存放a[i][j]點的查克拉剩餘量

struct inf;

int main()

}queueq;

q.push(inf);

ckl[si][sj]=k;//標記起點查克拉量

memset(ckl,-1,sizeof(ckl));

while(!q.empty()));

ckl[t.x-1][t.y]=t.k;

}else if(a[t.x-1][t.y]=='+'||t.k>0));

}

} if(t.y>0&&t.k>ckl[t.x][t.y-1]));

ckl[t.x][t.y-1]=t.k;

}else if(a[t.x][t.y-1]=='+'||t.k>0));

ckl[t.x][t.y-1]=t.k;

}} if(t.xckl[t.x+1][t.y]));

}else if(a[t.x+1][t.y]=='+'||t.k>0));

ckl[t.x+1][t.y]=t.k;

}} if(t.yckl[t.x][t.y+1]));

ckl[t.x][t.y+1]=t.k;

}else if(a[t.x][t.y+1]=='+'||t.k>0));

ckl[t.x][t.y+1]=t.k;

}} }

cout<<"-1"<

POJ 4115 鳴人和佐助

總時間限制 1000ms 記憶體限制 65536kb 描述 佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位...

4115 鳴人和佐助

總時間限制 1000ms 記憶體限制 65536kb 描述佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的...

百練4115 鳴人和佐助(變式BFS)

總時間限制 1000ms 記憶體限制 65536kb 描述 佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位...