ZOJ 2110 Tempter of the Bone DFS搜索+奇偶剪枝

本文介绍了一个基于二维网格的路径搜索算法实现,通过使用深度优先搜索(DFS)算法,并结合奇偶剪枝技巧来优化搜索过程,确保从起点到终点能够在限定时间内找到一条可行路径。

二维网格中的两个点a,b。设其最短距离为d(网格只能走横竖线,不能走斜线),那么实际从a到b的路程可能比d大或者相等,但与d的差一定是偶数,这就是我理解的奇偶剪枝的原理

#include<stdio.h> #include<queue> #include<string.h> #include<stdlib.h> #include<math.h> using namespace std; int m,n,t; char map[10][10]; bool visit[10][10]; int sx,sy,ex,ey; int h[4]={1,-1,0,0}; int g[4]={0,0,1,-1}; int dfs(int xx,int yy,int time){ int i; if(xx==ex && yy==ey && time==t) return 1; for(i=0;i<4;i++){ int x=xx+h[i]; int y=yy+g[i]; if(x>=m || x<0 || y>=n ||y<0) continue; if(map[x][y]=='X') continue; int temp=(t-(time+1))-(int)(abs(x-ex)+abs(y-ey)); if(temp<0 || temp%2==1) continue; map[x][y]='X'; if(dfs(x,y,time+1)) return 1; map[x][y]='.'; } return 0; } int main(){ int i,j,k; while(scanf("%d %d %d",&m,&n,&t) && !(m==0 && n==0 && t==0)){ int sum=0; for(i=0;i<m;i++){ scanf("%s",map[i]); } for(i=0;i<m;i++) for(j=0;j<n;j++){ if(map[i][j]=='S'){ sx=i; sy=j; } if(map[i][j]=='D'){ ex=i; ey=j; } if(map[i][j]=='.') sum++; } if(sum+1<t){ printf("NO\n"); continue; } map[sx][sy]='X'; if(dfs(sx,sy,0)) printf("YES\n"); else printf("NO\n"); } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值