比赛 20120309 评测结果 WAAAWWTTWW
题目名称 飞越原野 最终得分 30
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-03-09 22:16:29
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct hehe
{
	int x0,y0,t,neng;
}q[1000001];
int w[101][101],f[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int m,n,d,tou,wei,answer=10000000;
bool check(int x);
void bfs(int x);
int main()
{
	freopen ("escapea.in","r",stdin);
	freopen ("escapea.out","w",stdout);
	cin>>m>>n>>d;
	for (int i=1;i<=m;i++)
	{
		for (int j=1;j<=n;j++)
		{
			char a;
			cin>>a;
			if (a=='P')
				w[i][j]=1;
			else
				w[i][j]=0;
		}
	}
	q[0].x0=1;
	q[0].y0=1;
	q[0].t=0;
	q[0].neng=d;
	tou=0;
	wei=0;
	while (tou<=wei)
	{
		bfs(tou);
		if (q[tou].x0==m&&q[tou].y0==n)
		{
			if (q[tou].t<answer)
			{
				answer=q[tou].t;
			}
		}
		tou++;
	}
	if (answer==10000000)
		cout<<"impossible";
	else
		cout<<answer;
	return 0;
}
void bfs(int x)
{
	for (int i=0;i<4;i++)
	{
		int nx,ny;
		nx=q[x].x0+f[i][0];
		ny=q[x].y0+f[i][1];
		if (ny<=n&&nx<=m&&nx>0&&ny>0&&w[nx][ny])
		{
			wei++;
			q[wei].x0=nx;
			q[wei].y0=ny;
			q[wei].t=q[x].t+1;
			q[wei].neng=q[x].neng;
			if (!check(wei))
			{
				wei--;
				goto ne;
			}
		}
		ne:;
		for (int j=2;j<=q[x].neng;++j)
		{
			int xx,yy;
			xx=q[x].x0+j*f[i][0];
			yy=q[x].y0+j*f[i][1];
			if (yy<=n&&xx<=m&&xx>0&&yy>0&&w[xx][yy])
			{
				wei++;
				q[wei].x0=xx;
				q[wei].y0=yy;
				q[wei].t=q[x].t+1;
				q[wei].neng=q[x].neng-j;
				if (!check(wei))
				{
					wei--;
					continue;
				}
			}
		}
	}
}
bool check(int x)
{
	for (int i=0;i<x;i++)
	{
		if (q[i].x0==q[x].x0&&q[i].y0==q[x].y0&&q[x].t>=q[i].t&&q[i].neng<=q[x].neng)
		{
			return false;
		}
	}
	return true;
}