★实验任务
给定一个 m× n(m 行, n 列) 的迷宫, 迷宫中有两个位置, gloria 想从迷宫的一个位置走
到另外一个位置, 当然迷宫中有些地方是空地, gloria 可以穿越, 有些地方是障碍, 她必
须绕行,从迷宫的一个位置,只能走到与它相邻的 4 个位置中, 当然在行走过程中, gloria
不能走到迷宫外面去。令人头痛的是, gloria 是个没什么方向感的人,因此,她在行走过
程中, 不能转太多弯了, 否则她会晕倒的。我们假定给定的两个位置都是空地, 初始时, gloria
所面向的方向未定, 她可以 选择 4 个方向的任何一个出发, 而不算成一次转弯。 gloria 能
从一个位置走到另外一个位置吗?
★数据输入
第 1 行为两个整数 m, n (1 ≤ m, n ≤ 100), 分别表示迷宫的行数和列数,接下来 m
行, 每行包括 n 个字符, 其中字符'.' 表示该位置为空地, 字符'*' 表示该位置为障碍, 输入
数据中只有这两种字符,每组测试数据的最后一行为 5 个整数 k, x1, y1, x2, y2 (0 ≤ k ≤
20, 1 ≤ x1, x2 ≤ m, 1 ≤ y1, y2 ≤ n), 其中 k 表示 gloria 最多能转的弯数, (x1, y1), (x2,
y2) 表示两个位置,其中 x1, x2对应行, y1, y2对应列。
★数据输出
每组测试数据对应为一行,若 gloria 能从一个位置走到另外一个位置,输出“yes” ,
否则输出“no” 。
输入示例 输出示例
5 5 yes
...**
*.**.
.....
.....
*....
2 1 1 3 1
给定一个 m× n(m 行, n 列) 的迷宫, 迷宫中有两个位置, gloria 想从迷宫的一个位置走
到另外一个位置, 当然迷宫中有些地方是空地, gloria 可以穿越, 有些地方是障碍, 她必
须绕行,从迷宫的一个位置,只能走到与它相邻的 4 个位置中, 当然在行走过程中, gloria
不能走到迷宫外面去。令人头痛的是, gloria 是个没什么方向感的人,因此,她在行走过
程中, 不能转太多弯了, 否则她会晕倒的。我们假定给定的两个位置都是空地, 初始时, gloria
所面向的方向未定, 她可以 选择 4 个方向的任何一个出发, 而不算成一次转弯。 gloria 能
从一个位置走到另外一个位置吗?
★数据输入
第 1 行为两个整数 m, n (1 ≤ m, n ≤ 100), 分别表示迷宫的行数和列数,接下来 m
行, 每行包括 n 个字符, 其中字符'.' 表示该位置为空地, 字符'*' 表示该位置为障碍, 输入
数据中只有这两种字符,每组测试数据的最后一行为 5 个整数 k, x1, y1, x2, y2 (0 ≤ k ≤
20, 1 ≤ x1, x2 ≤ m, 1 ≤ y1, y2 ≤ n), 其中 k 表示 gloria 最多能转的弯数, (x1, y1), (x2,
y2) 表示两个位置,其中 x1, x2对应行, y1, y2对应列。
★数据输出
每组测试数据对应为一行,若 gloria 能从一个位置走到另外一个位置,输出“yes” ,
否则输出“no” 。
输入示例 输出示例
5 5 yes
...**
*.**.
.....
.....
*....
2 1 1 3 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=111;
struct Node{
int x,y,turn;
Node(int a,int b){
x=a; y=b; turn=-1;
}
Node(){}
};
int n,m;
int k,is,js,it,jt;
int map[maxn][maxn];
int offset[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
void init(){
int i,j;
char c;
for(i=0;i<=n+1;i++) map[i][0]=map[i][m+1]=1;
for(j=0;j<=m+1;j++) map[0][j]=map[n+1][j]=1;
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=m;j++){
scanf("%c",&c);
if(c=='.') map[i][j]=0;
else map[i][j]=1;
}
}
}
void bfs(){
int flag=0,i;
queue<Node> Q;
Node node(is,js),next;
map[is][js]=-1;
Q.push(node);
while(!Q.empty()){
node=Q.front();
Q.pop();
if(node.x==it&&node.y==jt&&node.turn<=k){
flag=1;
break;
}
next.turn=node.turn+1;
for(i=0;i<4;i++){
int a=node.x+offset[i][0];
int b=node.y+offset[i][1];
while(map[a][b]!=1){
if(!map[a][b]){
map[a][b]=-1;
next.x=a; next.y=b;
Q.push(next);
}
a+=offset[i][0];
b+=offset[i][1];
}
}
}
printf(flag?"yes\n":"no\n");
}
int main(){
scanf("%d%d",&n,&m);
init();
scanf("%d%d%d%d%d",&k,&is,&js,&it,&jt);
bfs();
return 0;
}