Bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通 广搜,深搜
1687: [Usaco2005 Open]Navigating the City 城市交通
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 122 Solved: 85
[Submit][Status][Discuss]
Description
由于牛奶市场的需求,奶牛必须前往城市,但是唯一可用的交通工具是出租车.教会奶牛如何在城市里打的.
给出一个城市地图,东西街区E(1≤E≤40),南北街区N(1≤N≤30).制作一个开车指南给出租车司机,告诉他如何从起点(用S表示)到终点(用E表示).每一个条目用空格分成两部分,第一个部分是方向(N,E,S,W之一),第二个是一个整数,表示要沿着这个方向开几个十字路口.如果存在多条路线,你应该给出最短的.数据保证,最短的路径存在且唯一. 地图中“+”表示十字路口,道路用“I”和“一”表示.建筑和其他设施用“.”表示.下面是一张地图:
3 6
+-+-+.+-+-+
|...|.....|
+-+.+-+-+-+
..|.......|
S-+-+-+.E-+
出租车可以沿着东,北,西,北,东开两个十字路口,以此类推.具体将由样例给出
3 6
+-+-+.+-+-+
|...|.....|
+-+.+-+-+-+
..|.......|
S-+-+-+.E-+
Input
第1行:两个用空格隔开的整数N和E.
第2到2N行:每行有2E-I个字符,表示地图.
Output
每行有一个表示方向的字母和一个表示要开几个十字路口的数字表示.
Sample Input
Sample Input
3 6
+-+-+.+-+-+
|...|.....|
+-+.+-+-+-+
..|.......|
S-+-+-+.E-+
Sample Output
E 1
N 1
W 1
N 1
E 2
S 1
E 3
S 1
W 1
N 1
W 1
N 1
E 2
S 1
E 3
S 1
W 1
HINT
Source
题解:
BFS+DFS
先用BFS遍历图,跑出所有的步数,再用DFS倒推找到合法路径。最后输出即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define INF 1e9 4 int fx[5]={-1,1,0,0}; 5 int fy[5]={0,0,-1,1}; 6 int n,m,dis[66][88],pd,bx,by; 7 int qx[4810],qy[4810]; 8 bool vv[66][88],vis[66][88]; 9 char a[66][88]; 10 void dfs(int x,int y,int bs) 11 { 12 int i,xx,yy; 13 vv[x][y]=true; 14 if(pd==1)return; 15 if(x==bx&&y==by){pd=1;return;} 16 for(i=0;i<=3;i++) 17 { 18 xx=x+fx[i]; 19 yy=y+fy[i]; 20 if(xx>=1&&xx<=2*n-1&&yy>=1&&yy<=2*m-1&&dis[xx][yy]==bs-1) 21 { 22 dfs(xx,yy,bs-1); 23 if(pd==1)return; 24 } 25 } 26 } 27 void print(int k) 28 { 29 if(k==0)printf("N"); 30 if(k==1)printf("S"); 31 if(k==2)printf("W"); 32 if(k==3)printf("E"); 33 } 34 int main() 35 { 36 int i,j,xx,yy,ex,ey,jl,fx1,ux,uy,vx,vy,head,tail; 37 scanf("%d %d",&n,&m); 38 for(i=1;i<=2*n-1;i++)scanf("\n%s",a[i]+1); 39 bx=0;by=0;ex=0;ey=0; 40 for(i=1;i<=2*n-1;i++) 41 { 42 for(j=1;j<=2*m-1;j++) 43 { 44 if(a[i][j]=='S')bx=i,by=j; 45 if(a[i][j]=='E')ex=i,ey=j; 46 dis[i][j]=INF; 47 } 48 } 49 head=0;tail=1; 50 qx[tail]=bx;qy[tail]=by;dis[bx][by]=0; 51 memset(vis,false,sizeof(vis));vis[bx][by]=true; 52 pd=0; 53 while(head!=tail) 54 { 55 head++;if(head==4820)head=0; 56 ux=qx[head]; 57 uy=qy[head]; 58 for(i=0;i<=3;i++) 59 { 60 vx=ux+fx[i]; 61 vy=uy+fy[i]; 62 if(vx>=1&&vx<=2*n-1&&vy>=1&&vy<=2*m-1&&vis[vx][vy]==false&&dis[vx][vy]>dis[ux][uy]+1&&a[vx][vy]!='.') 63 { 64 vis[vx][vy]=true; 65 dis[vx][vy]=dis[ux][uy]+1; 66 tail++;if(tail==4820)tail=0; 67 qx[tail]=vx; 68 qy[tail]=vy; 69 if(vx==ex&&vy==ey){pd=1;break;} 70 } 71 } 72 if(pd==1)break; 73 vis[ux][uy]=false; 74 } 75 memset(vv,false,sizeof(vv)); 76 pd=0; 77 dfs(ex,ey,dis[ex][ey]); 78 fx1=-1;//北0,南1,西2,东3. 79 jl=0; 80 vv[bx][by]=false; 81 while(1) 82 { 83 if(bx==ex&&by==ey){if(jl!=0){print(fx1);printf(" %d\n",(jl+1)/2);}break;} 84 for(i=0;i<=3;i++) 85 { 86 xx=bx+fx[i]; 87 yy=by+fy[i]; 88 if(vv[xx][yy]==true)break; 89 } 90 vv[xx][yy]=false; 91 bx=xx; 92 by=yy; 93 if(i==fx1)jl++; 94 else 95 { 96 if(fx1==-1){fx1=i;jl=1;} 97 else {print(fx1);printf(" %d\n",(jl+1)/2);fx1=i;jl=1;} 98 } 99 } 100 return 0; 101 }