Bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通 广搜,深搜

1687: [Usaco2005 Open]Navigating the City 城市交通

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 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

HINT

 

Source

Silver

题解:

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 }

 

posted @ 2016-03-28 11:02  微弱的世界  阅读(175)  评论(0编辑  收藏  举报