P1443 90分求职,一个数据点超时
查看原帖
P1443 90分求职,一个数据点超时
1776938
Lucian2007楼主2025/6/18 09:27

代码如下:

#include<bits/stdc++.h>
using namespace std;
int d[500][500];//存储走到点所需要的最少步数
int fx[9]={0,-1,-2,-2,-1,1,2,2,1};
int fy[9]={0,2,1,-1,-2,2,1,-1,-2};
int n,m;
void dfs(int x,int y,int def)//x,y表示坐标,def表示步数
{
	//def用来存储步数
	int tx,ty;
	d[x][y]=def;
	for(int i=1;i<=8;i++)
	{
		tx=x+fx[i];//遍历更新
		ty=y+fy[i];
		//先判断点可以通过并且不会出边界,这里不需要特别判断是因为这里是符号不是数字
		if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&def+1<d[tx][ty])//def+1<d[tx][ty]表示走到(tx,ty)的步数更少,实际上从(x,y)走到(tx,ty)的步数只需要一步,因为可能之前绕远路,所以更新之后再查看)
		dfs(tx,ty,def+1);//递推遍历
	}	
}

int main()
{
	int i,j,s1,s2,e1,e2;
	cin>>n>>m>>s1>>s2;
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
	{
	d[i][j]=INT_MAX;//记住在循环里面将初始步数定义为最大数
	}
	dfs(s1,s2,0);//应用函数
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
	{
		if(d[i][j]==INT_MAX) cout<<"-1"<<endl;
		else cout<<d[i][j]<<endl;
	}
	return 0;
}

本蒟蒻刚刚学的dfs,所以也不会bfs,想知道在这段代码基础上还是用dfs能否解决这道题。是数据点8超时了

2025/6/18 09:27
加载中...