hdu1010(深搜 剪枝 回溯)
来源:互联网 发布:java方法的定义和调用 编辑:程序博客网 时间:2024/05/08 18:42
这个题目我做的时候不是超时就是错误,自己是新手也一直不知道再怎么剪下去 就参考了网上一大牛blog
代码如下
#include<stdio.h>#include<stdlib.h>#include<string.h> //hdu1010 深搜优化剪枝 int m,n,t;char map[8][8];int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int ex,ey,sx,sy,ok;void dfs(int x,int y,int count){ int i; if(count==t) { if(ex==x&&ey==y) ok=1; return; } if(ok) return;//只要找到一条路径 那么就行了 int temp=abs(x-ex)+abs(y-ey)-abs(count-t);//剪枝的地方 判断为奇数或者偶数 if(temp>0||temp&1) return;//如过是奇数 或者当要走的路大于应该走的步数的时候,return; for(int i=0;i<4;i++) { int fx=x+dir[i][0]; int fy=y+dir[i][1]; if(fx>=0&&fx<n&&fy>=0&&fy<m&&map[fx][fy]!='X') { map[fx][fy]='X'; dfs(fx,fy,count+1); map[fx][fy]='.';//回溯 对于新手来说可以想一想程序运行框架} }}int main(){int i,j,wall;while(scanf("%d%d%d",&n,&m,&t)!=EOF&&(n||m||t)){wall=0;for(int i=0;i<n;i++){scanf("%s",map[i]);//最好用scanf gets容易出问题for(int j=0;j<m;j++){if(map[i][j]=='S'){sx=i;sy=j;}else if(map[i][j]=='D'){ex=i;ey=j;}else if(map[i][j]=='X')wall++;}}if(m*n-wall<=t) printf("NO\n");else{ok=0;map[sx][sy]='X';dfs(sx,sy,0);if(ok) printf("YES\n");else printf("NO\n"); }}return 0;}
0 0
- hdu1010(深搜 剪枝 回溯)
- HDU1010(回溯剪枝)
- hdu1010(深搜 +剪枝)
- hdu1010 Tempter of the Bone(DFS,剪枝,递归,回溯)
- HDU1010 深搜+奇偶剪枝
- hdu1010(dfs+剪枝)
- dfs+剪枝(hdu1010)
- hdu1010(dfs+剪枝)
- hdu1010 (dfs+奇偶剪枝)
- hdu1010(dfs加剪枝)
- hdu1010(dfs+奇偶剪枝)
- HDU1010(dfs+奇偶剪枝)
- hdu1010(Tempter of the Bone)深搜+剪枝
- hdu1010搜索+剪枝
- hdu1010 DFS和剪枝
- hdu1010 深搜剪枝.
- HDU1010-奇偶剪枝(DFS)
- hdu1010 dfs+路径剪枝
- 04环信聊天界面 - 计算cell的高度
- Unity出现中文乱码
- Erwin 生成 mysql 带注释(comment )的脚本
- 简单完美的解决键盘遮挡输入框的问题
- java并行编程
- hdu1010(深搜 剪枝 回溯)
- Mac OSX下安装php5.3之上的ZendOptimizer-即Guard Loader
- mybatis配置log4j不输出日志问题
- Understand for Linux安装方法
- 大数乘法
- iOS面试题三
- 用ZIP进行多文件保存
- linux下awk的关联数组
- 面试笔试杂项积累-leetcode 301-305