比赛 20120309 评测结果 AAAATTTTTA
题目名称 飞越原野 最终得分 50
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-03-09 21:18:13
显示代码纯文本
#include <cstdio>
using namespace std;

const short RUL[4][2]={{0,-1},{0,1},{-1,0},{1,0}};

struct quetype
{
	int x,y,d,deep,right;
}que[1000002];

char map[102][102];

bool dup(int top)
{
	int i;
	for (i=0;i<top;i++)
		if (que[i].right==que[top].right)
			return(true);
	return(false);
}

int main(void)
{
	freopen("escapea.in","r",stdin);
	freopen("escapea.out","w",stdout);
	int i,j,m,n,d,tx,ty,head=0,tail=0;
	bool done=false;
	scanf("%d%d%d\n",&m,&n,&d);
	for (i=1;i<=m;i++)
	{
		for (j=1;j<=n;j++)
			scanf("%c",&map[i][j]);
		scanf("\n");
	}
	que[0].x=1;
	que[0].y=1;
	que[0].d=d;
	que[0].deep=0;
	que[0].right=1*10000+1*100+d;
	while (head>=tail)
	{
		for (i=0;!done&&i<=3;i++)
		{
			for (j=2;!done&&j<=que[tail].d;j++)
			{
				tx=j*RUL[i][0]+que[tail].x;
				ty=j*RUL[i][1]+que[tail].y;
				if (tx>=1&&tx<=m&&ty>=1&&ty<=n&&map[tx][ty]=='P')
				{
					head++;
					que[head].x=tx;
					que[head].y=ty;
					que[head].d=que[tail].d-j;
					que[head].deep=que[tail].deep+1;
					que[head].right=tx*10000+ty*100+que[head].d;
					if (tx==m&&ty==n)
						done=true;
					if (done)
						break;
					if (dup(head))
						head--;
				}
			}
		}
		for (i=0;!done&&i<=3;i++)
		{
			tx=RUL[i][0]+que[tail].x;
			ty=RUL[i][1]+que[tail].y;
			if (tx>=1&&tx<=m&&ty>=1&&ty<=n&&map[tx][ty]=='P')
			{
				head++;
				que[head].x=tx;
				que[head].y=ty;
				que[head].d=que[tail].d;
				que[head].deep=que[tail].deep+1;
				que[head].right=tx*10000+ty*100+que[head].d;
				if (tx==m&&ty==n)
					done=true;
				if (done)
					break;
				if (dup(head))
					head--;
			}
		}
		if (done)
			break;
		tail++;
	}
	if (done)
		printf("%d\n",que[head].deep);
	else
		printf("impossible\n");
	return(0);
}