40分求助
  • 板块P1301 魔鬼之城
  • 楼主Roicer
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/9/3 21:38
  • 上次更新2023/11/5 13:46:16
查看原帖
40分求助
366744
Roicer楼主2020/9/3 21:38
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int n,m,map[101][101],u,v,mark[101][101];
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
	cin>>map[i][j];//存下魔法数
	int head=1,tail=1,q[2][101],dis[101][101];//
	memset(dis,-1,sizeof(dis));memset(mark,-1,sizeof(mark));
	dis[1][1]=0;
	q[0][head]=1;q[1][head]=1;
	int dx[8]={0,1,1,1,0,-1,-1,-1},dy[8]={-1,-1,0,1,1,1,0,-1};
	while(head<=tail)
	{
		u=q[0][head];v=q[1][head];
		head++;
		for(int i=0;i<=7;i++)
		{
			if(i==mark[u][v]) continue;//判断是否与来时方向相同
			int nx=u+dx[i]*map[v][u],ny=v+dy[i]*map[v][u];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&dis[nx][ny]==-1)
			{
				dis[nx][ny]=dis[u][v]+1;
				mark[nx][ny]=i;
				tail++;
				q[0][tail]=nx;q[1][tail]=ny;
			}
			if(nx==n&&ny==m)//到终点了
			{
				head+=tail;
				break;
			}
		}
	}
	/*for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
	cout<<dis[j][i]<<" ";*/
	if(dis[n][m]==-1) cout<<"NEVER";
	else cout<<dis[n][m];
	return 0;
}
2020/9/3 21:38
加载中...