题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1728
题目大意:
有一个M*N的矩阵迷宫。其中,字符'.'表示此处为空地,字符'*'表示此处为障碍。在迷宫中,只能向
相邻的上、下、左、右方向走。而且在走的时候,转弯最多不能超过k次。给你初始位置(x1,y1),终
止位置(x2,y2),问:是否能从初始位置走到终止位置。
思路:
建立一个结构体,结构体中(x,y)表示当前位置,t表示目前的转弯次数。搜索四个方向,并记录下转弯
数,如果转弯数大于或等于k,则继续另外的搜索。直到搜索到终止位置,返回1。如果最后也没有搜到,
返回0。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int Dire[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
char Map[110][110];
int N,M,x1,y1,x2,y2,k,vis[110][110];
struct Node
{
int x,y;
int t;
};
bool BFS()
{
memset(vis,0,sizeof(vis));
queue<Node> Q;
Node p,q;
p.x = x1;
p.y = y1;
p.t = -1;
vis[x1][y1] = 1;
Q.push(p);
while( !Q.empty() )
{
p = Q.front();
Q.pop();
if(p.t >= k)
continue;
for(int i = 0; i < 4; ++i)
{
q.x = p.x + Dire[i][0];
q.y = p.y + Dire[i][1];
q.t = p.t + 1;
while(1)
{
if(q.x < 0 || q.x >= M || q.y < 0 || q.y >= N)
break;
if(Map[q.x][q.y]=='*')
break;
if(q.x == x2 && q.y == y2)
return true;
if( !vis[q.x][q.y] )
{
Q.push(q);
vis[q.x][q.y] = 1;
}
q.x += Dire[i][0];
q.y += Dire[i][1];
}
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&M,&N);
for(int i = 0; i < M; ++i)
scanf("%s",Map[i]);
scanf("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2);
x1--,y1--,x2--,y2--;
swap(x1,y1);
swap(x2,y2);
if(BFS())
printf("yes\n");
else
printf("no\n");
}
return 0;
}