Time Limit: 10 second

Memory Limit: 2 MB

问题描述

给出一张地图,这张地图被分为n*m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平垂直或从垂直到水平)次数

Input

第1行: n m 第1至n+1行:整个地图地形描述(0:空地;1:高山), 第2行地形描述为: 1 0 0 0 0 1 0 第3行地形描述为: 0 0 1 0 1 0 0 ......

Output

s(即最少的拐弯次数)

Sample Input

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

Sample Output

5

【题解】

这题,用广搜来做。

因为广搜。可以按照转弯1次,转弯2次...的顺序进行扩展节点。

因此先前已经走过的点一定不会再入队一次。

可以用一个cost[x][y]数组,来记录从起点到x,y坐标的所需要的最少转弯次数。

一开始cost[x][y]等于正无穷,然后cost[x0][y0] = 0,x0yo是起点坐标。然后从x0,y0开始扩展节点。因为是以转弯次数为花费。所以认定一个方向之后可以一直走到头。

然后我们每次到达一个点,都递增一次转弯次数。这样的结果就是,最后会多算了一次转弯次数。最后减掉就可以了(扩展的话是4个方向定义两个常量数组就可以解决了)

【代码】

#include <cstdio>
#include <cstring> struct po //用po结构体来记录一个点的坐标
{
int x,y;
}; const int dx[5] = {0,0,0,1,-1}; //表示往4个方向扩展
const int dy[5] = {0,1,-1,0,0}; int n,m,a[101][101],x1,y1,x2,y2,cost[101][101];
po dl[10010]; int main()
{
//freopen("F:\\rush.txt","r",stdin);
memset(a,255,sizeof(a));
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++) //读入地图的信息
scanf("%d",&a[i][j]);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2); //读入起点和终点的坐标
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++) //一开始置初值为正无穷
cost[i][j] = 2100000000;
cost[x1][y1] = 0; //起点的花费为0,表示不用转弯就能到
dl[1].x = x1;dl[1].y = y1; //把起点坐标加入队列中
int head = 0,tail = 1;
while (head != tail) //进行广搜
{
head ++;
int xx = dl[head].x,yy = dl[head].y; //取出头结点
for (int i = 1;i <= 4;i++) //然后往4个方向扩展
{
int tx = xx,ty = yy;
while (a[tx+dx[i]][ty+dy[i]] == 0) //认准一个方向之后,如果这个方向还能走,就一直走
{
tx+=dx[i],ty+=dy[i];
if (cost[tx][ty] > cost[xx][yy] + 1) //如果txty是第一次到达。则一定可以更新的
{ //如果txty之前已经到达过。则不可能会更新。这样保证每个点都只最多入队一次
cost[tx][ty] = cost[xx][yy] +1;
tail++;
dl[tail].x = tx;
dl[tail].y = ty;
if (tx == x2 && ty == y2) //如果到达了终点,直接输出记录的值减去1,因为开始的时候多算了1次
{
printf("%d\n",cost[tx][ty]-1);
return 0;
}
} }
}
}
return 0;
}

【a802】最少转弯问题的更多相关文章

  1. 69.广搜练习:  最少转弯问题(TURN)

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

  2. 【bfs】最少转弯问题

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

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

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

  4. Luogu P1649 [USACO07OCT]障碍路线Obstacle Course

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

  5. 洛谷P4431

    题意翻译 题目大意: 给定一个n∗m的矩阵,每次你可以选择前进一格或转弯(90度),求在不出这个矩阵的情况下遍历全部格点所需最少转弯次数.有多组数据 输入格式: 第一行一个整数k,表示数据组数 以下k ...

  6. P1649 [USACO07OCT]障碍路线Obstacle Course

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

  7. Tinkoff Challenge - Elimination Round B. Igor and his way to work(dfs+优化)

    http://codeforces.com/contest/793/problem/B 题意:一个地图,有起点和终点还有障碍点,求从起点出发到达终点,经过的路径上转弯次数是否能不超过2. 思路: 直接 ...

  8. codevs与noi做题改错本目录

    从2016.2.13开始: 1.  排序超时的问题---------目录:-测试习题 2.  超高精度乘法超时问题-----------目录:高精度计算 算法:快速傅里叶算法. 压位算法 3. 高精度 ...

  9. [USACO07OCT]障碍路线Obstacle Course

    题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...

随机推荐

  1. R语言-方差分析

    方差分析指的是不同变量之间互相影响从而导致结果的变化 1.单因素方差分析: 案例:50名患者接受降低胆固醇治疗的药物,其中三种治疗条件使用药物相同(20mg一天一次,10mg一天两次,5mg一天四次) ...

  2. 前端面试题(计算机网络/http/https)

    (前端面试题大全,持续更新) 输入url的一系列过程 http缓存(缓存生效的情况),拓展下 get与post的异同,POST一般可以发送什么类型的文件 jsonp有什么不好的地方 http请求头(h ...

  3. [TypeScript@2.5] Omit catch error block if not needed

    From TypeScript@2.5, you can omit catch error block. Before: try { throw new Error('whatever'); } ca ...

  4. C#基础数据类型与字节数组(内存中的数据格式)相互转换(BitConverter 类)

      在某种通讯协议中(如 Modbus),可能需要把一些基本的数据类型内存中的表示形式转换成以字节数组的形式,方便传送.C/C++中可以利用指针等操作完成,但C#中没有指针,咋办呢?可以用BitCon ...

  5. sql基础知识集锦

    Sql常用语法 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT ...

  6. (转)如何启动或关闭数据库的归档(ARCHIVELOG)模式

    转自:http://www.eygle.com/archives/2004/10/oracle_howtoeci.html Oracle数据库可以运行在2种模式下:归档模式(archivelog)和非 ...

  7. Fiddler抓包工具详细介绍

    本文转自:http://www.cnblogs.com/Chilam007/p/6985379.html 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请 ...

  8. 微信小程序开发中如何实现侧边栏的滑动效果?

    原文链接:https://mp.weixin.qq.com/s/7CM18izpZqf0oc0D75IGmQ 1 概述 在手机应用的开发中侧边栏滑动是很常见的功能,当然在小程序中也不会例外,很多特效还 ...

  9. 【b702】字符串的展开

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入 ...

  10. python中有关字符串的处理

    原文 Python 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) 去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字 ...