hdu oj 1010 老是超时 先放到这里 参考别人ac代码

本文介绍了一种基于深度优先搜索(DFS)的迷宫寻路算法实现,通过递归方式探索从起点到终点的路径,并考虑了最短时间和最少步数的约束条件。该算法适用于固定大小的迷宫地图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <math.h>
int dir[][2] = {1,0,-1,0,0,1,0,-1};
bool vis[10][10];
char maze[10][10];
int n,m,t_time,end_x,end_y;
int myabs(int x)
{
	return x>=0?x:-x;
}
bool DFS(int pos_x,int pos_y,int t)
{
	int absx = abs(end_x-pos_x);
	int absy = abs(end_y-pos_y);

	if(maze[pos_x][pos_y]=='D'&&t==t_time)
	{
		return true;
	}

	//所用的时间超过所需最大时间 
	if(t>=t_time)
	{
		return false;
	}

	//设下的时间比理论最少到达时间要少那么必定到不了
	if(t_time-t<(absx+absy))
	{
		return false;
	}

	//剩余时间比理论最少时间多出的不是偶数必然到不了
	if((t_time-t-absx-absy)%2!=0)
	{
		return false;
	}

	int i,next_x,next_y;

	for(i=0;i<4;i++)
	{
		next_x = pos_x+dir[i][0];

		next_y = pos_y+dir[i][1];

		if(next_x>=0&&next_x<n&&next_y>=0&&next_y<m&&!vis[next_x][next_y]&&maze[next_x][next_y]!='X')
		{
			vis[next_x][next_y] = true;

			if(!DFS(next_x,next_y,t+1))
			{
				vis[next_x][next_y] = false;
			}
			else
			{
				return true;
			}
			
		}
	}

	return false;
}
int main()
{
	int i,j,star_x,star_y;

	bool flag;

	while(scanf("%d %d %d",&n,&m,&t_time)==3)
	{
		if(n==0&&m==0&&t_time==0)
			break;
		for(i=0;i<10;i++)
			for(j=0;j<10;j++)
				vis[i][j] = false;
		for(i=0;i<n;i++)
		{
			scanf("%s",maze[i]);
		}

		for (i=0;i<n;i++)
		{
			for (j=0;j<m;j++)
			{
				if(maze[i][j]=='S')	
				{
					star_x = i;
					star_y = j;
				}

				if(maze[i][j]=='X')
				{
					end_x = i;
					end_y = j;
				}
			}
		}
		vis[star_x][star_y] = true;

		flag = DFS(star_x,star_y,0);

		//flag  = BFS(star_x,star_y,0);
		if(!flag)
		{
			printf("NO\n");
		}
		else
		{
			printf("YES\n");
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值