当前位置: 代码迷 >> 综合 >> HDU 1728 逃离迷宫 (bfs+一条路走到底思想)
  详细解决方案

HDU 1728 逃离迷宫 (bfs+一条路走到底思想)

热度:78   发布时间:2023-11-17 14:41:46.0


                                    逃离迷宫

Problem Description
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
Input
第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
  第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1, y 1), (x 2, y 2)表示两个位置,其中x 1,x 2对应列,y 1, y 2对应行。
Output
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
Sample Input
        
2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
Sample Output
        
no yes
题解:
   就是bfs+将一个方向不为*的地方一次全部加入队列,wa了n次的一题。。wa的原因至今还是不太明白,看着一篇博客一点点修改,发现了wa的地方,就是
               while(xx>0&&xx<=n&&yy>0&&yy<=m&&s[xx][yy-1]!='*'){if(!p[xx][yy]){p[xx][yy]=1;next.x=xx;next.y=yy;next.turn=now.turn+1;q.push(next);}xx+=dirx[i];yy+=diry[i];}}
地方,不知道为什么不能直接写成while(xx>0&&xx<=n&&yy>0&&yy<=m&&!p[xx][yy]);
想了许久,应该是走过一遍的岔路的十字路口的小格子可以继续走一遍,不能停下,不然就无法走完所有位置了
代码:
#include<stdio.h>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<math.h>
using namespace std;
struct node
{int x,y;int turn;
};
int dirx[4]={-1,1,0,0};
int diry[4]={0,0,-1,1};
queue<node>q;
int p[105][105];
int main()
{int i,j,n,m,t,k,x1,x2,y1,y2,xx,yy,tag;node now,next;char s[105][105];scanf("%d",&t);while(t--){while(!q.empty())q.pop();scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%s",s[i]);for(j=1;j<=m;j++){if(s[i][j-1]=='*')p[i][j]=1;elsep[i][j]=0;}}scanf("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2);if(x1==x2&&y1==y2){printf("yes\n");continue;}swap(x1,y1);swap(x2,y2);now.turn=-1;now.x=x1;now.y=y1;p[x1][y1]=1;q.push(now);tag=0;while(!q.empty()){now=q.front();q.pop();if(now.x==x2&&now.y==y2&&now.turn<=k){tag=1;break;}for(i=0;i<4;i++){xx=now.x+dirx[i];yy=now.y+diry[i];while(xx>0&&xx<=n&&yy>0&&yy<=m&&s[xx][yy-1]!='*'){if(!p[xx][yy]){p[xx][yy]=1;next.x=xx;next.y=yy;next.turn=now.turn+1;q.push(next);}xx+=dirx[i];yy+=diry[i];}}}if(tag){printf("yes\n");}elseprintf("no\n");}return 0;
}