[HDU](1782)逃离迷宫 ---BFS(图)
逃离迷宫
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, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
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
解题新知:仅仅会搜索的模板还是不行的……关键是代码实现,如何搜,这种搜索的思想一定要锻炼出来。
继续努力ing!
参考:http://blog.csdn.net/zhuhuangjian/article/details/8262561
AC代码:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; char mmap[105][105]; int vis[105][105]; struct node { int x;//注意这道题x表示列 int y;//注意这道题y表示行 int sum; }; int n,m,k; int x1,y1,x2,y2; int dirx[]={0,0,1,-1}; int diry[]={1,-1,0,0}; void bfs() { int flag=0; node tmp; node cmp; queue<node>q; cmp.x=x1-1; cmp.y=y1-1; y2=y2-1; x2=x2-1; vis[cmp.y][cmp.x]=1; cmp.sum=-1; q.push(cmp); while(!q.empty()) { cmp=q.front(); q.pop(); if(cmp.x==x2 && cmp.y==y2 && cmp.sum<=k) { flag=1; break; } tmp.sum=cmp.sum+1; for(int i=0;i<4;i++) { int xx=cmp.x+dirx[i]; int yy=cmp.y+diry[i]; while(xx>=0 && xx<n &&yy>=0 &&yy<m &&mmap[yy][xx]!='*') { if(!vis[yy][xx]) { vis[yy][xx]=1; tmp.x=xx; tmp.y=yy; q.push(tmp); } xx+=dirx[i]; yy+=diry[i]; } } } if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; } int main() { int t; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); scanf("%d %d",&m,&n); for(int i=0;i<m;i++) scanf("%s",mmap[i]); scanf("%d %d %d %d %d",&k,&x1,&y1,&x2,&y2); bfs(); } return 0; }