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倒推找到合法路径。最后输出即可。

 #include<bits/stdc++.h>
using namespace std;
#define INF 1e9
int fx[]={-,,,};
int fy[]={,,-,};
int n,m,dis[][],pd,bx,by;
int qx[],qy[];
bool vv[][],vis[][];
char a[][];
void dfs(int x,int y,int bs)
{
int i,xx,yy;
vv[x][y]=true;
if(pd==)return;
if(x==bx&&y==by){pd=;return;}
for(i=;i<=;i++)
{
xx=x+fx[i];
yy=y+fy[i];
if(xx>=&&xx<=*n-&&yy>=&&yy<=*m-&&dis[xx][yy]==bs-)
{
dfs(xx,yy,bs-);
if(pd==)return;
}
}
}
void print(int k)
{
if(k==)printf("N");
if(k==)printf("S");
if(k==)printf("W");
if(k==)printf("E");
}
int main()
{
int i,j,xx,yy,ex,ey,jl,fx1,ux,uy,vx,vy,head,tail;
scanf("%d %d",&n,&m);
for(i=;i<=*n-;i++)scanf("\n%s",a[i]+);
bx=;by=;ex=;ey=;
for(i=;i<=*n-;i++)
{
for(j=;j<=*m-;j++)
{
if(a[i][j]=='S')bx=i,by=j;
if(a[i][j]=='E')ex=i,ey=j;
dis[i][j]=INF;
}
}
head=;tail=;
qx[tail]=bx;qy[tail]=by;dis[bx][by]=;
memset(vis,false,sizeof(vis));vis[bx][by]=true;
pd=;
while(head!=tail)
{
head++;if(head==)head=;
ux=qx[head];
uy=qy[head];
for(i=;i<=;i++)
{
vx=ux+fx[i];
vy=uy+fy[i];
if(vx>=&&vx<=*n-&&vy>=&&vy<=*m-&&vis[vx][vy]==false&&dis[vx][vy]>dis[ux][uy]+&&a[vx][vy]!='.')
{
vis[vx][vy]=true;
dis[vx][vy]=dis[ux][uy]+;
tail++;if(tail==)tail=;
qx[tail]=vx;
qy[tail]=vy;
if(vx==ex&&vy==ey){pd=;break;}
}
}
if(pd==)break;
vis[ux][uy]=false;
}
memset(vv,false,sizeof(vv));
pd=;
dfs(ex,ey,dis[ex][ey]);
fx1=-;//北0,南1,西2,东3.
jl=;
vv[bx][by]=false;
while()
{
if(bx==ex&&by==ey){if(jl!=){print(fx1);printf(" %d\n",(jl+)/);}break;}
for(i=;i<=;i++)
{
xx=bx+fx[i];
yy=by+fy[i];
if(vv[xx][yy]==true)break;
}
vv[xx][yy]=false;
bx=xx;
by=yy;
if(i==fx1)jl++;
else
{
if(fx1==-){fx1=i;jl=;}
else {print(fx1);printf(" %d\n",(jl+)/);fx1=i;jl=;}
}
}
return ;
}

Bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通 广搜,深搜的更多相关文章

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

    1687: [Usaco2005 Open]Navigating the City 城市交通 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 94  Sol ...

  2. 【BZOJ】1687: [Usaco2005 Open]Navigating the City 城市交通(bfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1687 bfs后然后逆向找图即可.因为题目保证最短路唯一 #include <cstdio> ...

  3. bzoj:1687;poj 2434:[Usaco2005 Open]Navigating the City 城市交通

    Description A dip in the milk market has forced the cows to move to the city. The only employment av ...

  4. Bzoj 1674: [Usaco2005]Part Acquisition dijkstra,堆

    1674: [Usaco2005]Part Acquisition Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 337  Solved: 162[Sub ...

  5. [BZOJ 1733] [Usaco2005 feb] Secret Milking Machine 【二分 + 最大流】

    题目链接:BZOJ - 1733 题目分析 直接二分这个最大边的边权,然后用最大流判断是否可以有 T 的流量. 代码 #include <iostream> #include <cs ...

  6. BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯

    题目 1739: [Usaco2005 mar]Space Elevator 太空电梯 Time Limit: 5 Sec  Memory Limit: 64 MB Description The c ...

  7. BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farm ...

  8. BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )

    完全背包.. --------------------------------------------------------------------------------------- #incl ...

  9. BZOJ 1679: [Usaco2005 Jan]Moo Volume 牛的呼声( )

    一开始直接 O( n² ) 暴力..结果就 A 了... USACO 数据是有多弱 = = 先sort , 然后自己再YY一下就能想出来...具体看code --------------------- ...

随机推荐

  1. Greedy is Good

    作者:supernova 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=greedyAlg Joh ...

  2. C#使用Json

    AJAX传递复杂数据如果自己进行格式定义的话会经历组装.解析的过程,因此AJAX中有一个事实上的数据传输标准JSon. Json将复杂对象序列化为一个字符串,在浏览器端再将字符串反序列化为JavaSc ...

  3. MVC的发展

    ASP.NET下的MVC从原始的1.0走到2.0,再到3.0,现在走到4.0,也许明年5.0就问世了,先不管那些,那说说这些MVC在ASP.NET是如何变化发展的.对于.net编程人员来说可能会很熟悉 ...

  4. 利用Linux系统生成随机密码的10种方法

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...

  5. 『奇葩问题集锦』Malformed lock file found: /var/cache/dnf/metadata_lock.pid.

    Malformed lock file found: /var/cache/dnf/metadata_lock.pid.Ensure no other dnf process is running a ...

  6. 收藏一个匹配html内容的文章

    http://blog.csdn.net/donglynn/article/details/35788879

  7. django 自定义标签

    Context和RequestContext都能被Template 进行render RequestContext类接受reqest,字典,processors 实例化.并被TEMPLATE_CONT ...

  8. WPF窗体置于桌面最底层

    在WPF中设置窗体的Topmost属性可以将窗体永远置于顶部,但是没有提供Bottommost属性将窗体置底.若果要将窗体置于桌面的最底部,就需要使用Windows API来实现了.解决方案如下: 1 ...

  9. js 小数格式化函数

    直接上代码,参数number为待格式化整数或小数,fix是要保留有效位数,过亿以亿结尾,过万以万结尾,toFixed函数记得,免得再查 function shorten_number (number, ...

  10. 双积分式(A/D)转换器电路结构及工作原理

    1.转换方式 V-T型间接转换ADC. 2.  电路结构 图1是这种转换器的原理电路,它由积分器(由集成运放A组成).过零比较器(C).时钟脉冲控制门(G)和计数器(ff0-ffn)等几部分组成 图1 ...