典型简单宽搜题!在一个maze里,存在一个男孩(Y)和一个女孩(G),问男孩能否在最短时间找到女孩!?当男孩找不到女孩时,输出Please give me another chance!当然题目没有这么简单。题目增加了,一种变化石头,当男孩到达某一点的时间是k的整数倍时石头就不存在,其他情况下石头是存在的。。关键是怎么处理石头!因为石头是随时间的变化而变化的,所以我们不能再采用原始的标志法来处理这个问题,也就是说,所以的路是可以重复走的!这里采用三维数组来标识每一点的状态,且每一次取最少时间。点击打开链接
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#define N 101
using namespace std;
int n,m,k,x1,y1,f[N][N][11];
int jump[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[N][N];
struct node
{
int x,y,s;
}q,r,p;
void init()
{
int i,j,k1;
cin>>n>>m>>k;
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='Y')
{
x1=i;y1=j;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k1=0;k1<11;k1++)
f[i][j][k1]=0x7ffffff;
}
}
}
int is_b(node p)
{
if(p.x<0 || p.y<0 || p.x>=n || p.y>=m)
return 1;
return 0;
}
int bfs()
{
int i;
queue< node > que;
p.x=x1;p.y=y1;p.s=0;
f[x1][y1][0]=0;
que.push(p);
while(!que.empty())
{
r=que.front();que.pop();
if(map[r.x][r.y]=='G') return r.s;
for(i=0;i<4;i++)
{
q.x=r.x+jump[i][0];
q.y=r.y+jump[i][1];
q.s=r.s+1;
if((is_b(q)) || (map[q.x][q.y]=='#' && q.s%k!=0)||
f[q.x][q.y][q.s%k]<=q.s ) continue;
f[q.x][q.y][q.s%k]=q.s;
que.push(q);
}
}
return -1;
}
int main ()
{
//freopen("dating.txt","r",stdin);
//ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
init();
int w=bfs();
if(w==-1) cout<<"Please give me another chance!"<<endl;
else cout<<w<<endl;
}
return 0;
}
![](https://img-my.csdn.net/uploads/201210/10/1349870546_8550.png)