比赛 20120808 评测结果 EWEEWEEEEE
题目名称 鬼屋惊魂 最终得分 0
用户昵称 Truth.Cirno 运行时间 1.227 s
代码语言 C++ 内存使用 26.99 MiB
提交时间 2012-08-08 12:09:30
显示代码纯文本
#include <cstdio>
using namespace std;

const int RUL[5][2]={{0,-1},{0,1},{-1,0},{1,0},{0,0}};

int n,que[1000000][3][2],deep[1000000],tar[3][2],tail,head,c;
char map[20][20];

bool check(void)
{
	int i;
	for (i=0;i<n;i++)
		if (tar[i][0]!=que[head][i][0]||tar[i][1]!=que[head][i][1])
			return(0);
	return(1);
}

void go(void)
{
	int t,t2,i[3],x[3],y[3];
	bool done=false,flag;
	while (!done&&head>=tail)
	{
		for (i[0]=0;i[0]<5;i[0]++)
		{
			if (n>1)
			{
				for (i[1]=0;i[1]<5;i[1]++)
				{
					if (n>2)
					{
						for (i[2]=0;i[2]<5;i[2]++)
						{
				/**/
				for (t=0;t<n;t++)
				{
					x[t]=que[tail][t][0]+RUL[i[t]][0];
					y[t]=que[tail][t][1]+RUL[i[t]][1];
				}
				flag=true;
				for (t=0;t<n;t++)
					if (x[t]>=0&&y[t]>=0&&map[x[t]][y[t]]=='#')
					{
						flag=false;
						break;
					}
				if (!flag)
					continue;
				for (t=0;t<n;t++)
					for (t2=0;t2<n;t2++)
						if (t!=t2&&que[tail][t][0]==x[t2]&&que[tail][t][1]==y[t2]&&que[tail][t2][0]==x[t]&&que[tail][t2][1]==y[t])
						{
							flag=false;
							break;
						}
				if (!flag)
					continue;
				head++;
				for (t=0;t<n;t++)
				{
					que[head][t][0]=x[t];
					que[head][t][1]=y[t];
				}
				deep[head]=deep[tail]+1;
				if (check())
					return;
				/**/
						}
					}
					else
					{
				/**/
				for (t=0;t<n;t++)
				{
					x[t]=que[tail][t][0]+RUL[i[t]][0];
					y[t]=que[tail][t][1]+RUL[i[t]][1];
				}
				flag=true;
				for (t=0;t<n;t++)
					if (map[x[t]][y[t]]=='#')
					{
						flag=false;
						break;
					}
				if (!flag)
					continue;
				for (t=0;t<n;t++)
					for (t2=0;t2<n;t2++)
						if (t!=t2&&que[tail][t][0]==x[t2]&&que[tail][t][1]==y[t2]&&que[tail][t2][0]==x[t]&&que[tail][t2][1]==y[t])
						{
							flag=false;
							break;
						}
				if (!flag)
					continue;
				head++;
				for (t=0;t<n;t++)
				{
					que[head][t][0]=x[t];
					que[head][t][1]=y[t];
				}
				deep[head]=deep[tail]+1;
				if (check())
					return;
				/**/
					}
				}
			}
			else
			{
				/**/
				for (t=0;t<n;t++)
				{
					x[t]=que[tail][t][0]+RUL[i[t]][0];
					y[t]=que[tail][t][1]+RUL[i[t]][1];
				}
				flag=true;
				for (t=0;t<n;t++)
					if (map[x[t]][y[t]]=='#')
					{
						flag=false;
						break;
					}
				if (!flag)
					continue;
				for (t=0;t<n;t++)
					for (t2=0;t2<n;t2++)
						if (t!=t2&&que[tail][t][0]==x[t2]&&que[tail][t][1]==y[t2]&&que[tail][t2][0]==x[t]&&que[tail][t2][1]==y[t])
						{
							flag=false;
							break;
						}
				if (!flag)
					continue;
				head++;
				for (t=0;t<n;t++)
				{
					que[head][t][0]=x[t];
					que[head][t][1]=y[t];
				}
				deep[head]=deep[tail]+1;
				if (check())
					return;
				/**/
			}
		}
		tail++;
	}
}

int main(void)
{
	freopen("jumby.in","r",stdin);
	freopen("jumby.out","w",stdout);
	int i,j,y,x;
	scanf("%d %d %d\n",&y,&x,&n);
	while (x!=0&&y!=0&&n!=0)
	{
		for (i=0;i<x;i++)
			scanf("%[^\n]\n",&map[i]);
		for (i=0;i<x;i++)
			for (j=0;j<y;j++)
				if (map[i][j]=='a')
				{
					que[0][0][0]=i;
					que[0][0][1]=j;
				}
				else if (map[i][j]=='b')
				{
					que[0][1][0]=i;
					que[0][1][1]=j;
				}
				else if (map[i][j]=='c')
				{
					que[0][2][0]=i;
					que[0][2][1]=j;
				}
				else if (map[i][j]=='A')
				{
					tar[0][0]=i;
					tar[0][1]=j;
				}
				else if (map[i][j]=='B')
				{
					tar[1][0]=i;
					tar[1][1]=j;
				}
				else if (map[i][j]=='C')
				{
					tar[2][0]=i;
					tar[2][1]=j;
				}
		go();
		printf("%d\n",deep[head]);
		scanf("%d %d %d\n",&y,&x,&n);
	}
	return(0);
}