hdu 1010(dfs+剪枝)

本文探讨了在给定时间内到达终点的最短路径问题,通过使用深度优先搜索(DFS)算法并结合奇偶剪枝策略解决。算法在路径选择时考虑了路径的长度和时间限制,确保了在规定时间内能够找到可行的路径。

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

思路:规定时刻到达终点,dfs即可,注意走过消失即可

剪枝:奇偶剪枝,设x为最短路程(直接到达),t为规定时间,t>=x&&(t-x)%2==0否则不可能到达

#include<stdio.h>
#include<string.h>
#define MAX 10

int n,m,k;
char map[MAX][MAX];
int visit[MAX][MAX];

int dfs(int x,int y,int num){
	visit[x][y]=1;
	if(x<1||x>n||y<1||y>m||map[x][y]=='X'){return 0;}
	if(map[x][y]=='D'&&num==k)return 1;
	if(num>=k){visit[x][y]=0;return 0;}
   	if(!visit[x][y+1]){
		if(dfs(x,y+1,num+1)==1)return 1;
		else{
			visit[x][y+1]=0;
		}
	}
	if(!visit[x][y-1]){
		if(dfs(x,y-1,num+1)==1)return 1;
		else{
			visit[x][y-1]=0;
		}
	}
	if(!visit[x-1][y]){
		if(dfs(x-1,y,num+1)==1)return 1;
		else{
			visit[x-1][y]=0;
		}
	}
	if(!visit[x+1][y]){
		if(dfs(x+1,y,num+1)==1)return 1;
		else{
			visit[x+1][y]=0;
		}
	}
	return 0;
}
int main(){
	int i,j;
	int xs,ys,xe,ye;
	int dis=0;
	while(scanf("%d%d%d",&n,&m,&k),n||m||k){
		getchar();
		memset(visit,0,sizeof(visit));
		for(i=1;i<=n;i++){
			for(j=1;j<=m;j++){
				scanf("%c",&map[i][j]);
				if(map[i][j]=='S'){xs=i;ys=j;}
				if(map[i][j]=='D'){xe=i;ye=j;}
			}
			getchar();
		}
		dis=0;
		dis+=xs>xe?xs-xe:xe-xs;
		dis+=ys>ye?ys-ye:ye-ys;
		if(dis>k||(k-dis)%2){printf("NO\n");continue;}
		if(dfs(xs,ys,0))printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}


剪枝:奇偶剪枝,最短路径为x,规定时间为t,则t>=x&&(t-x)%2==0不然不可能到达

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值