69.广搜练习: 最少转弯问题(TURN)
【问题描述】
给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图,最少的拐弯次数为5。
最少转弯问题(TURN)" title="69.广搜练习: 最少转弯问题(TURN)">
【输入格式】
第1行:n m
第2至n+1行:整个地图地形描述(0:空地;1:高山),
如(图)第2行地形描述为:1 0 0 0 0 1 0
第3行地形描述为:0 0 1 0 1 0 0
……
第n+2行:x1 y1
x2 y2 (分别为起点、终点坐标)
【输出格式】
s
(即最少的拐弯次数)
【输入输出样例】(见图):
TURN.IN |
TURN.OUT |
5 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 3 1 |
5 |
基本思路:利用广搜寻找一条从起点到终点最短路径,利用pre[]数组一直
错误代码:(最先找到的最短路径不一定是拐弯最少的):
#include
#include
using
namespace std;
#include
struct
Poi{
int x,y;
};
Poi
dl[10001];
int
xq,yq,xz,yz,n,m,jz[101][101],pre[101*101],t=0;
int
xx[]={0,0,1,-1};
int
yy[]={1,-1,0,0};
long long
sum=0;
int
head=0,tail=1;
void
BFS()
{
dl[tail].x=xq;
dl[tail].y=yq;
pre[tail]=0;
jz[xq][yq]=1;
while(head
{
++head;
int x0=dl[head].x,y0=dl[head].y;
for(int i=0;i<4;++i)
{
int x1=x0+xx[i],y1=y0+yy[i];
if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&!jz[x1][y1])
{
jz[x1][y1]=1;
++tail;
dl[tail].x=x1;
dl[tail].y=y1;
pre[tail]=head;
}
if(dl[tail].x==xz&&dl[tail].y==yz)
{
head=tail;
break;
}
}
}
}
void
count()
{
for(int i=tail;pre[pre[i]]!=0;i=pre[i])
{
if(dl[i].x!=dl[pre[pre[i]]].x&&dl[i].y!=dl[pre[pre[i]]].y)
sum++;
}
}
void
input()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&jz[i][j]);
scanf("%d%d%d%d",&xq,&yq,&xz,&yz);
}
int
main()
{
input();
BFS();
count();
printf("%d",sum);
return 0;
}
特例:
5
7
0 0 0 1 0
0 0
0 1 0 0 0
1 0
0 0 1 1 1
0 0
0 1 0 0 0
0 0
0 0 0 0 0
0 0
1 1 1
7
正确答案:是2错误答案:4(是找到最短路)
正确代码:
#include
#include
using
namespace std;
#include
const int
INF=999999;
int
n,m,jz[101][101];
struct
Dl{
int x,y;
};
Dl
dl[101*101];
int
xq,xz,yz,yq,turn[101][101],x0,y0;int k;int
head=0,tail=1;
void
input()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&jz[i][j]);
scanf("%d%d%d%d",&xq,&yq,&xz,&yz);
memset(turn,99,sizeof(turn));
}
void
search(int i,int j,int p)
{
k+=p;
if(turn[i][j]<1667457891) return;//说明之前已经找过了
++tail;dl[tail].x=i;
dl[tail].y=j;
turn[i][j]=turn[x0][y0]+1;//再找到下个点时,一定已经拐弯了
}
void
BFS()
{
dl[tail].x=xq;
dl[tail].y=yq;
turn[xq][yq]=-1;//把初值设为-1,才把与起点共线的步数设为0
while(head
{
++head;
x0=dl[head].x,y0=dl[head].y;
k=x0+1;while(k<=n&&jz[k][y0]==0)
search(k,y0,1);//只要是在一条直线上的就一次走到底,拐弯数最少
k=x0-1;while(k>=1&&jz[k][y0]==0)
search(k,y0,-1);
k=y0+1;while(k<=m&&jz[x0][k]==0)
search(x0,k,1);
k=y0-1;while(k>=1&&jz[x0][k]==0)
search(x0,k,-1);
}
}
int
main()
{
input();
BFS();
printf("%d",turn[xz][yz]);
return 0;
}
//1667457891
69.广搜练习: 最少转弯问题(TURN)的更多相关文章
- NYOJ-58最少步数,广搜思想!
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 -> Link <- 这个题深搜广搜都是可以的,迷宫已经给出了,就看怎么做了:一般起点终点确定用广搜 ...
- hdu 1195 Open the Lock(广搜,简单)
题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...
- hdu 1175 连连看 (广搜,注意解题思维,简单)
题目 解析见代码 #define _CRT_SECURE_NO_WARNINGS //这是非一般的最短路,所以广搜到的最短的路不一定是所要的路线 //所以应该把所有的路径都搜索出来,找到最短的转折数, ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
- (C++一本通)最少转弯问题 (经典搜索)
题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...
- 【a802】最少转弯问题
Time Limit: 10 second Memory Limit: 2 MB 问题描述 给出一张地图,这张地图被分为n*m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通 ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- 双向广搜 codevs 3060 抓住那头奶牛
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
随机推荐
- Go语言 2 变量、常量和数据类型
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 2.1 变量 变量是对一块内存空间的命名,程序可以通 ...
- mysql中列的增删改
增加列: ); ) after id; ) first; 修改列名: ); #change可改名字与字段类型 mysql> alter table a change uid uid int; Q ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- 配置kernel的log buf大小(如果kmsg log被覆盖)
如果在打印kmsg log时发现log被覆盖,log 的buf不够大可以使用默认配置调buf: defconfig CONFIG_LOG_BUF_SHIFT=20 (默认是17 2的17次方) ...
- memcached安装【转】
1.安装依赖软件 # yum -y install libevent libevent-devel perl-Test-Harness perl-Time-HiRes perl-TermReadKey ...
- 15个你不得不知道的Chrome dev tools的小技巧
转载自:https://www.imooc.com/article/2559 谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器.伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chro ...
- ubuntu查看mysql版本的几种方法
ubuntu查看mysql版本的几种方法 mysql 1:在终端下:mysql -V(大写) //代码 $ mysql -V mysql Ver 14.14 Distrib 5.5.46, for d ...
- java之正则表达式、日期操作
正则表达式和日期操作 正则表达式简介 正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求. 作用:比如注册邮箱,邮箱有用户名和密码,一 ...
- Cookie对象与Session对象-java
1.Cookie对象 1.1常见的方法 (1)创建Cookie对象,绑定数据 new Cookie(String name, String value) (2)发送Cookie对象 response. ...
- HDU 1878 欧拉回路(判断欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 题目大意:欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一 ...