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对应行。
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
思路
就是问在这个拐外限制条件下能不能走出这个迷宫,处理这个拐弯问题大概有两种方法吧,第一种是记录前面的路径,第二种是先一个方向走完所有可以走的点,下一次走的时候肯定是换方向走了然后拐弯数+1就可以。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 110;
struct Node{
int x,y,k;
};
queue<Node>q;
int m,n,sx,sy,ex,ey,k;
int visited[maxn][maxn];
char map[maxn][maxn];
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
void new_set()
{
while(!q.empty()){
q.pop();
}
memset(visited,0,sizeof(visited));
}
bool check(int x,int y)
{
if(x >= 1 && x <= m && y >= 1 && y <= n && map[x][y] != '*'){
return true;
}
else{
return false;
}
}
void bfs()
{
Node s;
s.x = sx;s.y = sy;s.k = -1; //最开始初始化为-1
q.push(s);
visited[sx][sy] = 1;
int flag = 0;
while(!q.empty()){
Node p = q.front();
q.pop();
if(p.x == ex && p.y == ey && p.k <= k){
flag = 1;
break;
}
int sk = p.k + 1;
for(int i = 0;i < 4;i++){
int nx = p.x + dx[i];
int ny = p.y + dy[i];
while(check(nx,ny)){
if(visited[nx][ny] == 0){
Node ptr;
ptr.x = nx;
ptr.y = ny;
ptr.k = sk;
visited[nx][ny] = 1;
q.push(ptr);
}
nx += dx[i];
ny += dy[i];
}
}
}
if(flag == 1){
cout<<"yes"<<endl;
}
else{
cout<<"no"<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--){
cin>>m>>n;
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
cin>>map[i][j];
}
}
cin>>k>>sy>>sx>>ey>>ex;
new_set();
bfs();
}
return 0;
}
愿你走出半生,归来仍是少年~