【问题描述】

给出一张地图,这张地图被分为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
7

1 0 0 0 0
1 0

0 0 1 0 1
0 0

0 0 0 0 1
0 1

0 1 1 0 0
0 0

0 0 0 0 1
1 0

1 3 1
7

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)的更多相关文章

  1. NYOJ-58最少步数,广搜思想!

    最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 ->   Link  <- 这个题深搜广搜都是可以的,迷宫已经给出了,就看怎么做了:一般起点终点确定用广搜 ...

  2. hdu 1195 Open the Lock(广搜,简单)

    题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...

  3. hdu 1175 连连看 (广搜,注意解题思维,简单)

    题目 解析见代码 #define _CRT_SECURE_NO_WARNINGS //这是非一般的最短路,所以广搜到的最短的路不一定是所要的路线 //所以应该把所有的路径都搜索出来,找到最短的转折数, ...

  4. poj3126 Prime Path 广搜bfs

    题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...

  5. (C++一本通)最少转弯问题 (经典搜索)

    题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...

  6. 【a802】最少转弯问题

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 给出一张地图,这张地图被分为n*m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通 ...

  7. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  8. 双向广搜 codevs 3060 抓住那头奶牛

    codevs 3060 抓住那头奶牛 USACO  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold   题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...

  9. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

随机推荐

  1. docker使用现有容器生成新的镜像

    /*运行docker run后 --则进入该容器里了 我们做一些变更,比如安装一些东西 ,然后针对这个容器进行创建新的镜像 */ 基本形式: docker commit -m "change ...

  2. php常用代码段

    点击换验证码 <a href=" src="{:U('Reglog/vcode')}" /></a> TP上一条下一条 $prev=$artica ...

  3. mysql 提权总结

    1.MOF提权 简单的说mof就是系统内部的一个程序,每隔一定时间系统就会以root权限去执行,我们将其替换然后执行我们的而已攻击代码.此举称之为mof提权. 以下便是脚本: #pragma name ...

  4. flask插件系列之flask_restful设计API

    前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...

  5. Centos查看端口占用和关闭端口

    Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令:   lsof -i tcp:80   列出所有端口   netstat -ntlp   1.开启端口(以80端口为例)     ...

  6. 关于"轉淚點"与"轉捩點"

    经常看台湾偶像剧或台湾综艺节目的人,一定听过"转泪点"这个词,虽然我一直不知道这三个字具体是怎么写, 但其意思很容易明白,就是"转折点"的意思.今天无聊在看凤凰 ...

  7. HTML表格的基本操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  8. 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165301 实验三<Java面向对象程序设计>实验报告 一.敏捷开发与XP实践-1 实验要求: 在IDEA中使用工具(Code->Reformate C ...

  9. [MySQL]You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    执行update语句,出现问题: 问题描述: You are using safe update mode and you tried to update a table without a WHER ...

  10. hdu 5895(矩阵快速幂+欧拉函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5895 f(n)=f(n-2)+2*f(n-1) f(n)*f(n-1)=f(n-2)*f(n-1)+2 ...