标签:范围 cstring print problem printf sizeof net 需要 include
为判断某时刻能否走到某位置,建立shi数组,记录某位置最早t时刻就不能走。(初始化为-1)之后开始从(0,0)出发bfs,用bu数组记录走到某一位置时花费的步数,并且需要用vi数组记录是否走到过某个位置,不然慧反复走出错。注意可走的范围是第一象限,只是输入的陨石掉落位置是0——300。(之前因为这个判断位置是否合法WA了……)。
参考代码:
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 }
标签:范围 cstring print problem printf sizeof net 需要 include
原文地址:http://www.cnblogs.com/quintessence/p/6124011.html