hdu1010 dfs+剪枝 (挺机智的题。。)
2016-02-04 21:54
429 查看
一道DFS+剪枝题,题目意思是问能否在规定时间到达出口(路径不能重复),一开始我以为在t时间内到达就行了。。果断写了一个BFS然后一直WA,一搜题解才恍然大悟。。。一个简单的DFS,剪枝部分很机智,根据起点终点还有规定时间的奇偶性质可以剪枝,然后最短路线和时间的关系可以剪枝。
以下是代码:
以下是代码:
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; struct pnode { int r,c; }s,d; int n,m,t,flag=0; char a[10][10]; int b[10][10]; int xr[]={0,1,0,-1}; int yr[]={1,0,-1,0}; void dfs(int x,int y,int step) { if(step>t)return ; if(x==d.r && y==d.c && step==t){ flag=1; return ; } for(int i=0;i<4;i++){ if(flag)return ; int xx=x+xr[i]; int yy=y+yr[i]; if(xx>=0 && xx<n && yy>=0 && yy<m && !b[xx][yy] && a[xx][yy]!='X'){ b[xx][yy]=1; dfs(xx,yy,step+1); b[xx][yy]=0; } } } int main() { // freopen("in.txt","r",stdin); while(1){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%d%d%d",&n,&m,&t); if(n==0 && m==0 && t==0) break; for(int i=0;i<n;i++) scanf("%s",a[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if(a[i][j]=='S') s.r=i , s.c=j; if(a[i][j]=='D') d.r=i , d.c=j; } int ret=s.r+s.c+d.r+d.c; if((ret+t)%2==1){printf("NO\n"); continue;} //剪枝1 if(abs(s.r-d.r)+abs(s.c-d.c)>t){printf("NO\n"); continue;} //剪枝2 flag=0; b[s.r][s.c]=1; dfs(s.r,s.c,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- java.lang.ClassNotFoundException: org.directwebremoting.servlet.DwrServlet
- MySTL:KMP单模快速字符串匹配算法
- 浅谈MES的通用设计之三:过程数据的上传
- MathJax 支持的 Latex 符号总结
- MathJax 支持的 Latex 符号总结
- unity中怎样获取全部子物体的组件
- POJ 1017:Packets【细心】
- 3D特效
- 浅谈MES的通用设计之二:工艺参数的下载
- Android开发学习之路--Activity之四种启动模式
- iOS 技能图谱
- Anaconda下安装Scrapy
- Android开发学习之路--Activity之四种启动模式
- Match:Blue Jeans(POJ 3080)
- POJ 2186 Popular Cows(强连通分量+缩点)
- RHEL7.2
- 迅雷云监工crysadm搭建
- 浅谈MES的通用设计之一:数据传输
- 2016-2-4 linux 基础学习10
- 命令行获取SHA1