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. Android时间对话框TimePickerDialog介绍

    目前网上流行着很多对“时间对话框TimePickerDialog”的讲解文章,但感觉都不是很详细.这里详细对该方面的知识进行介绍,旨在帮助初学者能够快速掌握该项技术. 首先要做的是声明一个日历类的对象 ...

  2. Project Euler 389 Platonic Dice (概率)

    题目链接: https://projecteuler.net/problem=389 题意: 掷一个正四面体骰子,记点数为\(T\). 掷\(T\)个正六面体骰子,记点数和为\(C\). 掷\(C\) ...

  3. 软件——机器学习与Python,Python3的输出与输入

    输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') p ...

  4. AsyncCallback BeginInvode endinvode 异步调用

    下面是搜藏的代码: //首先准备好,要进行C#异步调用的方法(能C#异步调用的,最好不多线程) private string MethodName(int Num, out int Num2) { N ...

  5. LeetCode Algorithm 01_Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  6. TPS54232-------电源管理芯片

    TPS54232 DC DC开关稳压器 电源管理芯片 放大器俗称功放 注意看芯片的次序1~8是如何排布的,这个规律一般是固定的 也许我们整理多了就能发现引脚的宽度和长度都是规格好的. 下面是封装: 所 ...

  7. UVA 11646 - Athletics Track || UVA 11817 - Tunnelling the Earth 几何

    题目大意: 两题几何水题. 1.UVA 11646 - Athletics Track 如图,体育场的跑道一圈400米,其中弯道是两段半径相同的圆弧,已知矩形的长宽比例为a:b,求长和宽的具体数值. ...

  8. Spring Boot中的缓存支持(一)注解配置与EhCache使用

    Spring Boot中的缓存支持(一)注解配置与EhCache使用 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决 ...

  9. 优雅地使用Retrofit+RxJava(二)

    前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现非常多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期.我就写写平时我在使用RxJava+Retrofi ...

  10. 每天一个JavaScript实例-操作元素定位元素

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...