ZOJ 2110 Tempter of the Bone DFS搜索+奇偶剪枝
2012-01-12 20:17
309 查看
二维网格中的两个点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"); } }
相关文章推荐
- ZOJ 2110 Tempter of the Bone
- zoj 2110 || hdoj 1010 Tempter of the Bone(DFS)
- Zoj 2110 Tempter of the Bone
- 3.26 三一 A ZOJ 2110 小狗逃生 dFS 限制时间(步数)
- ZOJ 2110 Tempter of the Bone
- zoj 2110
- Tempter of the Bone_ZOJ 2110
- zoj 2110 Tempter of the Bone
- ZOJ2110 骨头的诱惑
- zoj 2110 -- 未解决
- ZOJ 2110 Tempter of the Bone
- zoj 2110 Tempter of the Bone(DFS+奇偶剪枝及优化操作)
- zoj 2110 Tempter of the Bone (dfs)
- ZOJ2110 HDU1010 搜索 Tempter of the Bone
- ZOJ 2110(HDU 1010) Tempter of the Bone(经典剪枝-奇偶剪枝)
- zoj 2110
- ZOJ 2110 Tempter of the Bone (DFS+减枝)
- Tempter of the Bone 回溯法 hdu1010 zoj2110
- 奇偶剪枝-优化(ZOJ 2110 , HDU 1010)
- ZOJ 2110 Tempter of the Bone (DFS+减枝)