第一个测试点过不了,90分求助
查看原帖
第一个测试点过不了,90分求助
835944
gyttnnd楼主2022/12/2 20:47
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int step[109][109];
// 存储每一个格子的步数
// 从(  n,m)走出 
struct node
{
	int x,y,way,run;
	//x为行 y为列 way为方向 run为走过的步数 
};
queue<node> q;
//q为队列 
bool vis[109][109][109];
//存储是否走过 

int main()
{
	int n,m;
	//n为列 m为行 
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		cin>>step[i][j];
	} 
	memset(vis,1,sizeof(vis));
	// 1为走过 0为未走过
	node u;
	u.x=1,u.y=1,u.way=9,u.run=0;
	q.push(u);
	while(!q.empty())
	{
		node p;
		p=q.front();
		//弹出第一个值 
		q.pop();
		int xx=p.x;
		// 列 
		int yy=p.y;
		//行 
		int wayy=p.way;
		//方向 
		int runn=p.run;
		//步数 
		if(xx==n&&yy==m)
		{
			// 到达位置
			cout<<runn;
			exit(0);
		}
		if(wayy!=1)
		//1为向右 
		{
			int go=step[xx][yy];
			//应走的步数
			if(xx+go>=1&&xx+go<=n&&yy>=1&&yy<=m&&vis[xx+go][yy][wayy]==1)
			//在范围内且为来过 
			{
				vis[xx+go][yy][wayy]=0;
				//来过
				u.x=xx+go,u.y=yy,u.way=1,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=2)
		//2为向左 
		{
			int go=step[xx][yy];
			if(xx-go>=1&&xx-go<=n&&yy>=1&&yy<=m&&vis[xx-go][yy][wayy]==1) 
			{
				vis[xx-go][yy][wayy]=0;
				u.x=xx-go,u.y=yy,u.way=2,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=3)
		//3为向下 
		{
			int go=step[xx][yy];
			if(xx>=1&&xx<=n&&yy+go>=1&&yy+go<=m&&vis[xx][yy+go][wayy]==1)
			{
				vis[xx][yy+go][wayy]=0;
				u.x=xx,u.y=yy+go,u.way=3,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=4)
		//4为向上 
		{
			int go=step[xx][yy];
			if(xx>=1&&xx<=n&&yy-go>=1&&yy-go<=m&&vis[xx][yy-go][wayy]==1) 
			{
				vis[xx][yy-go][wayy]=0;
				u.x=xx,u.y=yy-go,u.way=4,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=5)
		//5为向左上 
		{
			int go=step[xx][yy];
			if(xx-go>=1&&xx-go<=n&&yy-go>=1&&yy-go<=m&&vis[xx-go][yy-go][wayy]==1)
			{
				vis[xx-go][yy-go][wayy]=0;
				u.x=xx-go,u.y=yy-go,u.way=5,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=6)
		//6为向左下 
		{
			int go=step[xx][yy];
			if(xx-go>=1&&xx-go<=n&&yy+go>=1&&yy+go<=m&&vis[xx-go][yy+go][wayy]==1)
			{
				vis[xx-go][yy+go][wayy]=0;
				u.x=xx-go,u.y=yy+go,u.way=6,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=7)
		//7为向右上 
		{
			int go=step[xx][yy];
			if(xx+go>=1&&xx+go<=n&&yy-go>=1&&yy-go<=m&&vis[xx+go][yy-go][wayy]==1)
			{
				vis[xx+go][yy-go][wayy]=0;
				u.x=xx+go,u.y=yy-go,u.way=7,u.run=runn+1;
				q.push(u); 
			}
		} 
		if(wayy!=8)
		//8为向右下 
		{
			int go=step[xx][yy];
			if(xx+go>=1&&xx+go<=n&&yy+go>=1&&yy+go<=m&&vis[xx+go][yy+go][wayy]==1)
			{
				vis[xx+go][yy+go][wayy]=0;
				u.x=xx+go,u.y=yy+go,u.way=8,u.run=runn+1;
				q.push(u); 
			}
		} 
	}
	cout<<"NEVER";
	return 0;
}
2022/12/2 20:47
加载中...