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
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
N 1
W 1
N 1
E 2
S 1
E 3
S 1
W 1
HINT
Source
题解:
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 城市交通 广搜,深搜的更多相关文章
- 1687: [Usaco2005 Open]Navigating the City 城市交通
1687: [Usaco2005 Open]Navigating the City 城市交通 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 94 Sol ...
- 【BZOJ】1687: [Usaco2005 Open]Navigating the City 城市交通(bfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1687 bfs后然后逆向找图即可.因为题目保证最短路唯一 #include <cstdio> ...
- 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 ...
- Bzoj 1674: [Usaco2005]Part Acquisition dijkstra,堆
1674: [Usaco2005]Part Acquisition Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 337 Solved: 162[Sub ...
- [BZOJ 1733] [Usaco2005 feb] Secret Milking Machine 【二分 + 最大流】
题目链接:BZOJ - 1733 题目分析 直接二分这个最大边的边权,然后用最大流判断是否可以有 T 的流量. 代码 #include <iostream> #include <cs ...
- BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯
题目 1739: [Usaco2005 mar]Space Elevator 太空电梯 Time Limit: 5 Sec Memory Limit: 64 MB Description The c ...
- BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MB Description Farm ...
- BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )
完全背包.. --------------------------------------------------------------------------------------- #incl ...
- BZOJ 1679: [Usaco2005 Jan]Moo Volume 牛的呼声( )
一开始直接 O( n² ) 暴力..结果就 A 了... USACO 数据是有多弱 = = 先sort , 然后自己再YY一下就能想出来...具体看code --------------------- ...
随机推荐
- 关于C++对汉字拼音的处理(3)
之所以汉字转拼音的博文能出到3,主要是因为没有很完美的C++的解决方案,但是写到了这里可以有一个小结了. 以前的方法都有这种那种弊端,如果出现了无法识别的汉字(简体的)就无法修改处理了,但是下面的这种 ...
- Licode Install CentOS 7.0
mysqldump --add-drop-table -uroot -p123456 jit >/extra_disk/jit.sql sudo npm install -g node-gyp ...
- php 商务网站购物车联动地址
数据表如下: CREATE TABLE IF NOT EXISTS `china` (`region_id` smallint(5) unsigned NOT NULL, `parent_id` s ...
- hadoop2.610集群配置(包含HA和Hbase )
.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机等)/etc/hosts里面要配置的是内 ...
- ObjectCopy
对象的传参用的是传引用,但开发中通常不允许对传入参数进行修改.因此对象拷贝很常用,Python提供一个很方便的对象拷贝方法 如代码: __author__ = 'mengxuan' import co ...
- python 中对list做减法操作
问题描述:假设我有这样两个list, 一个是list1,list1 = [1, 2, 3, 4, 5] 一个是list2,list2 = [1, 4, 5] ...
- 标签form表单里的属性简单介绍了一下
<form id="form1" name="form1" method="post" action=""> ...
- Word里插入表格不带左右边框
插入表格后选中,然后开始-----段落------选择右下角的边框设置,选择无左右边框.
- javascript mvc
http://www.webjx.com/javascript/jsajax-15996.html http://blog.csdn.net/jjfat/article/details/7963608 ...
- Javascript 取小数点后面N位
用Javascript取float型小数点后两位,例22.127456取成22.13,如何做? 1. 最笨的办法....... [我就怎么干的.........] 1function get() 2{ ...