深度搜索DFS hdu-1010
2015-08-04 17:51
573 查看
#include <stdio.h> #include <math.h> int m,n,t,flag; int sx,sy,ex,ey; int xmove[4]={0,1,0,-1},ymove[4]={1,0,-1,0}; char a[8][8]; int temp; void dfs(int x,int y,int tt) { int i; int tx,ty; if(x==ex&&y==ey&&t==tt) { flag=1; return ; } temp=fabs(t-tt)-fabs(ex-x)-fabs(ey-y); if(temp<0||temp&1) return ;(时间剪枝) for(i=0;i<4;i++) { tx=x+xmove[i]; ty=y+ymove[i]; if(tx<0||tx>=n||ty<0||ty>=m) continue ; if(a[tx][ty]!='X'){ a[tx][ty]='X'; dfs(tx,ty,tt+1); a[tx][ty]='.'; } if(flag) return ; } } int main() { while(scanf("%d %d %d",&n,&m,&t)&&(n+m+t)){ int i,j; int k=0; for(i=0;i<n;i++) { scanf("%s",a[i]); for(j=0;j<m;j++) { if(a[i][j]=='S') { sx=i,sy=j; a[i][j]='X'; } if(a[i][j]=='D') ex=i,ey=j; if(a[i][j]=='.') k++; } } if(k+1<t)(时间剪枝) { printf("NO\n"); continue; } if((int)(fabs(ex-sx)+(int)fabs(ey-sy)+t)%2==1)(时间剪枝) { printf("NO\n"); continue; } dfs(sx,sy,0); if(flag) printf("YES\n"); else printf("NO\n"); flag=0;} return 0; }
此题注意输入时scanf("%s",)可以把之前的回车忽略掉;
而gets()不可以,gets()会将回车读入,且此行不能再输入其他数据;
且getchar()与gets()一起用在hdu上会wa,可能在OJ测试数据上有些多余的回车(个人见解);
此题主干为深度搜索(DFS)
此外还有时间剪枝(节约时间)
相关文章推荐
- 个人用户防黑指南
- 个人学习Linux知识总结第1/4页
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- 我见过最全的个人js加解密功能页面
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- block传值
- 代理传值
- 单例传值
- 属性传值
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 个人兴建网站有哪些事情需要特别注意?怎样才能不被k站?
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup