Dating with girls(2)

典型简单宽搜题!在一个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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值