題目大意:
一個人從(0,0)出發,這個地方會落下隕石,當隕石落在(x,y)時,會把(x,y)這個地方和相鄰的的四個地方破壞掉,求該人到達安全地點的最小時間,若無解輸出-1
思路:
好吧,我最近都在做水題。
輸入的時候更新地圖,每個點取最小的被破壞的時間,然後進行BFS,在BFS途中,如果當前時間>=被破壞的,那麼就代表不能進入。
#include#include #include #include using namespace std; const int MAXN=300+10; const int dx[]={1,-1,0,0,0}; const int dy[]={0,0,1,-1,0}; int map[MAXN][MAXN]; bool vis[MAXN][MAXN]; void update(int x,int y,int t) { if(x<0||y<0) return; if(map[x][y] !=-1 && map[x][y]<=t) return; map[x][y]=t; } struct state { int x,y,t; state(int x=0,int y=0,int t=0):x(x),y(y),t(t){} }; int bfs() { memset(vis,0,sizeof(vis)); queue q; q.push(state(0,0,0)); while(!q.empty()) { state cur=q.front(); q.pop(); for(int i=0;i<4;i++) { int nx=cur.x+dx[i]; int ny=cur.y+dy[i]; if( nx<0 || ny<0 ) continue; if(map[nx][ny]==-1) return cur.t+1; int nt=cur.t+1; if( vis[nx][ny] || nt>=map[nx][ny]) continue; q.push(state(nx,ny,nt)); vis[nx][ny]=true; } } return -1; } int main() { int m; while(~scanf(%d,&m)) { memset(map,-1,sizeof(map)); for(int i=0;i