題目地址ios
爲判斷某時刻可否走到某位置,創建shi數組,記錄某位置最先t時刻就不能走。(初始化爲-1)以後開始從(0,0)出發bfs,用bu數組記錄走到某一位置時花費的步數,而且須要用vi數組記錄是否走到過某個位置,否則慧反覆走出錯。注意可走的範圍是第一象限,只是輸入的隕石掉落位置是0——300。(以前由於這個判斷位置是否合法WA了……)。數組
參考代碼:spa
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include <iostream> 5 using namespace std; 6 int shi[305][305],m,bu[305][305],dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 7 bool vi[305][305]; 8 typedef pair<int ,int >P; 9 int si,sj,t; 10 int bfs() 11 { 12 queue<P> que; 13 P p; 14 que.push(P(0,0)); 15 while(que.size()) 16 { 17 p=que.front(); 18 que.pop(); 19 if(shi[p.first][p.second]==-1) 20 return bu[p.first][p.second]; 21 int i,xx,yy; 22 for(i=0;i<4;i++) 23 { 24 xx=p.first+dir[i][0]; 25 yy=p.second+dir[i][1]; 26 if(xx>=0&&xx<=302&&yy>=0&&yy<=302&&(shi[xx][yy]==-1||bu[p.first][p.second]+1<shi[xx][yy])&&!vi[xx][yy]) 27 { 28 que.push(P(xx,yy)); 29 bu[xx][yy]=bu[p.first][p.second]+1; 30 vi[xx][yy]=true; 31 } 32 } 33 } 34 return -1; 35 } 36 int main() 37 { 38 memset(shi,-1,sizeof(shi)); 39 memset(bu,0,sizeof(bu)); 40 memset(vi,false,sizeof(vi)); 41 scanf("%d",&m); 42 int i,an; 43 while(m--) 44 { 45 scanf("%d%d%d",&si,&sj,&t); 46 if(shi[si][sj]==-1||shi[si][sj]>t) 47 shi[si][sj]=t; 48 for(i=0;i<4;i++) 49 { 50 int xx,yy; 51 xx=si+dir[i][0]; 52 yy=sj+dir[i][1]; 53 if(xx>=0&&xx<=302&&yy>=0&&yy<=302&&(shi[xx][yy]>t||shi[xx][yy]==-1)) 54 shi[xx][yy]=t; 55 } 56 } 57 vi[0][0]=true; 58 an=bfs(); 59 printf("%d\n",an); 60 return 0; 61 }