记录编号 137256 评测结果 AAAAAAAAAA
题目名称 魔鬼之城 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.024 s
提交时间 2014-11-04 16:15:33 内存使用 1.08 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n,m,j,i,k,l,p,zj1,zj2,zj3,ans;
int to[10001][8]={0},zui[8][10001]={0};
bool flag[8][10001]={0},flag2[10001][8]={0};
queue<int> A,B;
void init()
{
	scanf("%d%d",&m,&n);
	for(i=1;i<=n;i++)
	for(p=1;p<=m;p++)
	{
		zj1=(i-1)*m+p;
		for(l=0;l<8;l++)zui[l][zj1]=1e7;
		scanf("%d",&zj2);
		if(p+zj2<=m)
		{
			to[zj1][2]=zj1+zj2;
			flag2[zj1][2]=1;
		}
		if(p>zj2)
		{
			to[zj1][6]=zj1-zj2;
			flag2[zj1][6]=1;
		}
		if(i>zj2)
		{
			zj3=(i-zj2-1)*m+p;
			to[zj1][0]=zj3;
			flag2[zj1][0]=1;
			if(p+zj2<=m)
			{
				to[zj1][1]=zj3+zj2;
				flag2[zj1][1]=1;
			}
			if(p>zj2)
			{
				to[zj1][7]=zj3-zj2;
				flag2[zj1][7]=1;
			}
		}
		if(i+zj2<=n)
		{
			zj3=(i+zj2-1)*m+p;
			to[zj1][4]=zj3;
			flag2[zj1][4]=1;
			if(p+zj2<=m)
			{
				to[zj1][3]=zj3+zj2;
				flag2[zj1][3]=1;
			}
			if(p>zj2)
			{
				to[zj1][5]=zj3-zj2;
				flag2[zj1][5]=1;
			}
		}
	}
}
void work()
{
	for(i=0;i<8;i++)zui[i][1]=0;
	for(i=0;i<8;i++)
	if(flag2[1][i])
	{
		zui[i][to[1][i]]=1;
		flag[i][to[1][i]]=1;
		A.push(to[1][i]);
		B.push(i);
	}
	while(!A.empty())
	{
		zj1=A.front();A.pop();
		zj2=B.front();B.pop();
		flag[zj2][zj1]=0;
		for(i=0;i<8;i++)
		if(i!=zj2&&flag2[zj1][i])
		{
			zj3=zui[zj2][zj1]+1;
			if(zj3<zui[i][ to[zj1][i] ])
			{
				zui[i][ to[zj1][i] ]=zj3;
				if(!flag[i][to[zj1][i]])
				{
					A.push(to[zj1][i]);
					B.push(i);
				}
			}
		}
	}
	n*=m;
	ans=zui[0][n];
	for(i=1;i<8;i++)
	if(zui[i][n]<ans)ans=zui[i][n];
}
int main()
{
	freopen("pils.in","r",stdin);
	freopen("pils.out","w",stdout);
	init();
	work();
	if(ans==1e7)printf("NEVAR\n");
	else printf("%d\n",ans);
	return 0;
}