RQNOJ 34 紧急援救
题目描述
话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送装置,我们终于确定了他的位置,必须赶快到那里去救他。
根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到Mike博士最短距离。
数据范围: n<=1000
输入格式
第一行为n
第二行为n*n的地图(其中0表示通路,1表示死路)
最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。
输出格式
一个数字k,表示从研究所出发找到Milk博士的最短距离。
裸宽搜。
BFS队列要开大,开50W拿了80分,悲伤
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 int mp[1100][1100]; 8 bool vis[1100][1100]; 9 char c[1100]; 10 int n; 11 int sx,sy,tx,ty; 12 int mx[5]={0,1,0,-1,0}, 13 my[5]={0,0,1,0,-1}; 14 int BFS(){ 15 int hd=1,tl=0; 16 int qx[1000000],qy[1000000],qans[1000000]; 17 qx[++tl]=sx;qy[tl]=sy;qans[tl]=0; 18 vis[sx][sy]=1; 19 while(hd<=tl){ 20 for(int i=1;i<=4;i++){ 21 int nx=mx[i]+qx[hd]; 22 int ny=my[i]+qy[hd]; 23 if(nx>0 && nx<=n && ny>0 && ny<=n && 24 !vis[nx][ny] && !mp[nx][ny]){ 25 vis[nx][ny]=1; 26 qx[++tl]=nx; 27 qy[tl]=ny; 28 qans[tl]=qans[hd]+1; 29 if(nx==tx && ny==ty){ 30 return qans[tl]; 31 } 32 } 33 } 34 hd++; 35 } 36 } 37 int main(){ 38 scanf("%d",&n); 39 int i,j; 40 for(i=1;i<=n;i++){ 41 scanf("%s",c+1); 42 for(j=1;j<=n;j++){ 43 mp[i][j]=c[j]-'0'; 44 } 45 } 46 scanf("%d%d%d%d",&sx,&sy,&tx,&ty); 47 printf("%d\n",BFS()); 48 return 0; 49 }
本文为博主原创文章,转载请注明出处。