题解 P1301 【魔鬼之城】
这道题在蒟蒻看来就是bfs的模板,但是还是有一个坑点。
主要是visit数组,本蒟蒻在10分卡了很久,就是因为visit数组没有开三维。
v[i][j][way]表示第i行第j列是其他点走way这个方向走来的。
还有v数组应保存从任一点走到这里的最小步数。
请大家看我题解中c++代码中最短的一篇
CODE:
#include<bits/stdc++.h>
using namespace std;
int mapa[105][105];
int v[105][105][10];
int dx[9]={0,0,1,1,1,0,-1,-1,-1};
int dy[9]={0,-1,-1,0,1,1,1,0,-1};
struct node{
int x,y,step,way;
};
queue<node> q;
int main()
{
int n,m;
memset(v,0,sizeof(v));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mapa[i][j]);
node start;
start.x=1,start.y=1;
start.step=0,start.way=9;
q.push(start);
while(!q.empty())
{
node now=q.front();
q.pop();
if(now.x==m&&now.y==n)
{
printf("%d",now.step);
return 0;
}
for(int i=1;i<=8;i++)
{
if(now.way!=i)
{
int tx=now.x+dx[i]*mapa[now.x][now.y];
int ty=now.y+dy[i]*mapa[now.x][now.y];
int ts=now.step;
if(tx<=m&&ty<=n&&tx>=1&&ty>=1&&v[tx][ty][i]==0)
{
v[tx][ty][i]=1;
node ans;
ans.x=tx,ans.y=ty;
ans.step=ts+1,ans.way=i;
q.push(ans);
}
}
}
}
printf("NEVER");
}