給出n*m乙個地圖,一共最少有2個格,最多有200000格。有起點,終點,怪獸及其攻擊的範圍,輸出從起點到終點的最短距離,如果無法到達終點,則輸出「-1」。
難點:無法直接建立二維陣列儲存地圖(陣列空間太大),需要用一維間接變成二維或者自行開闢空間;對怪獸攻擊範圍的處理;起點或終點在攻擊範圍內。
解決:用一維陣列,每m個作一行。用bfs先對怪獸的攻擊進行處理。判斷起點和終點是否在攻擊範圍之內。
#include
#include
#include
#include
using
namespace std;
int n, m, d;
int s, f, max_x;
//起點,終點,總的格數
int _map[
200005];
//地圖
queue<
int>m_que,x_que;
//對怪獸攻擊範圍的處理
void
bfs_m()
x1 = x +1;
//右if
(x10&& _map[x1]==0
) x1 = x - m;
//上if
(x1>=
0&& _map[x1]==0
) x1 = x + m;
//下if
(x1)}
}//最小路徑
void
bfs(
) x1 = x +1;
//右if
(x10&& x1!=s && _map[x1]==0
) x1 = x - m;
//上if
(x1>=
0&& x1!=s && _map[x1]==0
) x1 = x -1;
//左if
(x1>=
0&& x1%m!=m-
1&& x1!=s && _map[x1]==0
)}}}
intmain()
x++;}
getchar()
;}max_x = x;
bfs_m()
;//怪獸攻擊範圍越往外值越大,但不大於-1
if(_map[s]
<
0|| _map[f]
<
0) cout <<
"-1"
<< endl;
else
return0;
}
最後,希望路過的dl們能給予改進的建議! 2019 GDUT 新生專題 I A
給定n個數字,計算出最短的連續子串行,使這個子串行的全部數字之和大於或等於給定數字s。如果不存在可以滿足題意的子串行則輸出0。這是經典的,相對比較容易的尺取問題,通過遍歷每乙個連續子串行即可得出答案。但是,由於時間的限制,要注意一些已經沒有意義的連續子串行和被重複計算的過程。include incl...
2019 GDUT 新生專題 I B,C
給出n m的乙個地圖,代表著沒有水的陸地,w 代表著水窪,所以相鄰的水窪,包括對角相鄰,形成乙個池塘,要求的就是池塘的數目。通過深度優先搜尋,對每乙個水窪進行遍歷,被遍歷過的水窪被標記為陸地,防止被再次遍歷或者進入死迴圈,每次退出了迴圈則池塘數目加一,直到地圖上沒有水窪。include includ...
2019 GDUT 新生專題 I D,F
給出n個石頭及其每個石頭的價值和重量,選取k個石頭,重量之和不大於給定的w,來做成項鍊,要求構成項鍊的石頭的價值之和最大,輸出這個最大值。include include using namespace std int n,k,want w want w 項鍊不超過的重量 int num 已選的石頭數...