记录编号 |
137256 |
评测结果 |
AAAAAAAAAA |
题目名称 |
魔鬼之城 |
最终得分 |
100 |
用户昵称 |
水中音 |
是否通过 |
通过 |
代码语言 |
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;
}