hdu 1728 bfs 变形最小转弯数

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
//hdu 1728
背景:wa了29次,最后还是借助别人的想法。

第一种想法:把visit数组的每一个位置储存为到达当前坐标点所需要的最小转弯数,最后对于每个走过的点都是到达该点的最小转弯数。这样的最小转弯数点又递推下一个最小转弯数点.....这样层层递推直到终点。

第二种方法:在普通情况下的bfs是每一步都走距离为1,找出所有的下一步放入队列,然后这样层层递推,而这个题中我们bfs每次由该点出去所有四个方向上的点加入队列,这样这些点都只多转了一次弯,想当于把距离加一变成转弯数加一。

求最短距离就把每次增加一步作为bfs的变量。
求最小转弯数就把每次增加一次转弯作为bfs的变量。
好和谐!

第一种想法代码:

#include<map>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M 209
#define INF 100000000
#define LL long long int
using namespace std;
int t,n,m,k,x1,x2,y1,y2,ans=INF,dir[4][2]={-1,0,0,1,1,0,0,-1};
char maps[M][M];
int visit[M][M];
struct place{int x,y,step,last;}temp1,temp2;

void bfs(void){
     temp1.x=x1;
     temp1.y=y1;
     temp1.step=0;
     temp1.last=-1;
     queue<place> q;
     q.push(temp1);
     while(!q.empty()){
         temp1=q.front();
         q.pop();
         if(temp1.step > k) continue;
         if(temp1.x == x2 && temp1.y == y2){
            if(temp1.step < ans) ans=temp1.step;
            if(ans <= k) return;
         }
         for(int i=0;i < 4;i++){
             if(temp1.x+dir[i][0] > 0 && temp1.x +dir[i][0] <= n && temp1.y+dir[i][1] > 0 && temp1.y+dir[i][1] <= m){
                 temp2.x=temp1.x+dir[i][0];
                 temp2.y=temp1.y+dir[i][1];
                 if(temp1.last != -1 && temp1.last != i) temp2.step=temp1.step+1;
                 else temp2.step=temp1.step;
                 temp2.last=i;
                 if(maps[temp2.x][temp2.y] == '.' && temp2.step <= visit[temp2.x][temp2.y]){
                     visit[temp2.x][temp2.y]=temp2.step;
                     q.push(temp2);
                 }
             }
         }
     }
}

int main(void){
    scanf("%d",&t);
    while(t--){
        ans=INF;
        //memset(visit,100000000001,sizeof(visit));
        for(int i=0;i < M;i++) for(int j=0;j < M;j++) visit[i][j]=INF;
        //printf("visit:%d %d\n",visit[0][0],visit[1][2]);
        scanf("%d%d",&n,&m);getchar();
        for(int i=1;i <= n;i++){
            for(int j=1;j <= m;j++){
                scanf("%c",&maps[i][j]);
            }
            getchar();
        }
        scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
        bfs();
        if(ans <= k) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}




HDOJ 1728 逃离迷宫(BFS,拐弯次最少 HDOJ 1728开始拿到这道题,想到先前写过的BFS,由出口到终点,最短路径。后来一看题目不是这个意思,题目要求拐弯最少到达终点而不是求最短路径。 看了解题报告,有了一点点思路,就是先选定一条方向,然后把该方向上所有能拐的弯都拐了。也就是说,运动的方向不仅仅是周围的四个点,因为没求最短时间,为了避免BFS提前结束,就把四个方向搜索到底。 注意,这里记录拐弯的K的初始值不是0而是-1,因为第 阅读详情

相关推荐

hdu 1728 bfs 最小拐弯

hdu 1728

liujc_的专栏 1729

追梦算法----最小拐弯路径

说明 农夫约翰在农场工作了一天,感觉比较累,准备开车回家。约翰在比较累的时候,喜欢走直路,不喜欢拐弯,哪怕走少拐弯的路回家更远,约翰也想走直路(好任性的约翰!)。请你从约翰的出发地到目的地找一条路,使得约翰回家拐弯最少。 输入格式 第一行两个整n和m(n和m都是1000以内的整),代表地图的大小。 接下来的n行,每行有m个,其中能够同行的点用0表示,不能通行的点用1表示。 再接下来1行,有4个整,s1、s2、e1、e2,s1和s2表示出发点的坐标,e1和e2表示目的地的坐标。 输出格式

今天会营业的博客 3143

拐弯 c++

拐弯 题目描述: N*N(1<=N<=100)方格中,’x’表示不能行走的格子,’.’表示可以行走的格子。卡门很胖,故而不好转弯。现在要从A点走到B点,请问最少要转90度弯几次? 输入格式: 第一行一个整:N,下面N行,每行N个字符,只出现字符:’.’,’x’,’A’,’B’,表示上面所说的矩阵格子,每个字符后有一个空格。 输出格式: 一个整最少转弯。如果不能到达,输出-1 样例输入: 3 . x A . . . B x . 样例输出: 2 根据题目,我画

m0_61048491的博客 1644

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

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

weixin_30908103的博客 778

最少转弯问题

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

Genius_panda_ACM的博客 1520

SSL JudgeOnline 2277——最少转弯问题

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

weixin_30843605的博客 304

hdu 1728 逃离迷宫 (bfs变形)

Problem Description   给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不...

qq_37396257的博客 646

经典拐弯问题(dfs || bfs

题目 这是搜索题中的经典拐弯问题,难点在于怎么标记已经搜索过的点。 对于某一个点来说,从不同路径但是最后从同一个方向到达这个点所需的拐弯可能是不同的。 例如: 5 5 S.*T. ..... ..... ..... ..... 同样向右走到 (1,2)的两种走法 ,一种是从右往下,然后再往右,拐了两次弯; 而另一种先向下,然后再往右,实际上只用拐一次弯 ,所以在搜索过程中需要更新更优解而另一种先向下 ,然后再往右,实际上只用拐一次弯,所以在搜索过 程中需要更新更优解 而我们想要求的是是否可以在拐

weixin_45925735的博客 775

【SSL 2325】最小转弯问题【广搜 BFS

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

524

最少拐弯问题——搜索,bfs,P1126 机器人搬重物

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.61.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动11步(Creep向前移动2步(Walk向前移动33 步(Run向左转(Left向右转(Right每个指令所需要的时间为11 秒。请你计算一下机器人完成任务所需的最少时间。

Landing_on_Mars的博客 458

神犇营-my1087-最少转弯问题

【小韦同学@神犇营-my1087-最少转弯问题】 题目: 描述 给出一张地图,这张地图被分为 n×m(n, m <= 100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1, y1)这块平地, 问:你至少需要拐几个弯才能到达目的地(x2,y2)? 你只能沿着水平和垂直方向的平地上行进,拐弯次就等于行进方向的改变(从水平到垂直或从垂直到水平)的次。 ...

小韦同学的博客 859

python 01障碍矩阵,最短路径,最小转弯, BFS

最短路径 matrix = [[0,0,0],[0,1,0],[0,0,0],[0,1,1],[0,0,0]] m = len(matrix) n = len(matrix[0]) res = [[0 for _ in range(n)] for _ in range(m)] vis = [[0 for _ in range(n)] for _ in range(m)] sx, sy = 1, 2 #起点 ex, ey = 4, 1 #终点 q = [] q.append([sx,sy,0]) while

qq_38636513的博客 812

最小转弯问题BFS

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

在人间贩卖声音 1826

最少转弯问题(turn)

最少转弯问题(turn) 思路:一道标准的广搜题(虽然说深搜好像也能过 ) ,难点在于如何判断转弯。 因为要记录转弯,所以我们就需要在大结构体里在定义一个记录方向的变量f,然后就正常广搜就行了。代码细节还是挺多的,具体注释吧。 AC代码: #include<bits/stdc++.h> using namespace std; int n,m,x1,y,x2,y2,h,t,a[120][120]; int fx[5]={0,1,0,-1,0},fy[5]={0,0,1,0,-1};//转向

Melancholy的博客 2215

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

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

weixin_30394981的博客 1418

2258: 【搜索】【广度优先】最少转弯问题

给出一张地图,这张地图被分为n×m(n,m

yangrenrui的博客 1107

题解 搜索综合

几串代码大同小异

yours8的博客 1138

【9018p1434】最少转弯

#include #include using namespace std; int n,m,ex,ey,sx,sy; const int xx[4]={-1,0,1,0},yy[4]={0,-1,0,1}; bool map[101][101]; struct data{ int x,y,t,last; }q[10001]; void bfs(){ int t=0,w=1; q[t].x=

714

经典c程序(0039) ---求转弯

/************************************************************************************** * Function : test * Create Date : 2014/07/14 * Author : NTSK13 * Email : beijiwei@qq.com * Cop

NTSK13 1150
上一篇: poj 3087 模拟
下一篇: scu集训队第二次周赛记录
羁绊残阳
博客等级 码龄12年 73粉丝 446原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值