zoukankan      html  css  js  c++  java
  • 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("
    %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
    ",(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
    ",(jl+1)/2);fx1=i;jl=1;}
     98         }
     99     }
    100     return 0;
    101 }
  • 相关阅读:
    云题库错题分析
    数据库相关子查询
    阻止事件冒泡
    21分钟 MySQL 入门教程(转载!!!)
    java接口
    java访问修饰符
    小游戏,快速击键
    个人对Java中多态的一些简单理解
    简述抽象和封装,对你学习Java有一些作用
    Bank,我只是来完成作业的
  • 原文地址:https://www.cnblogs.com/Var123/p/5328236.html
Copyright © 2011-2022 走看看