HDU 1010
来源:互联网 发布:淘宝手机详情页文字 编辑:程序博客网 时间:2024/06/15 06:57
直接深搜会超时
由于是限制了走的步数可以用棋盘奇偶性定理剪枝此题总共剪三枝
奇偶性
超时
缺少空间
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;char a[10][10];int n,m,t,enx,eny;int dir_x[]={-1,0,0,1};int dir_y[]={0,1,-1,0};int dis(int x,int y){ return abs(enx-x)+abs(eny-y);}bool dfs(int x,int y,int tim,int sum){ if(x<=0||y<=0||x>n||y>m||a[x][y]=='X') return 0;//边界 if(tim>t) return 0;//超时剪枝 if(sum<(t-tim)) return 0;//缺空间剪枝 if(a[x][y]=='D'&&tim==t) return 1; char temp=a[x][y];a[x][y]='X';//准备释放用过的不合理路径 for(int i=0;i<4;i++) if(dfs(x+dir_x[i],y+dir_y[i],tim+1,sum-1)) return 1; a[x][y]=temp; return 0;}int main(){ while(scanf("%d%d%d",&n,&m,&t)){ if(n==0&&m==0&&t==0) break; getchar(); int stx,sty,sum; for(int i=0;i<=n+1;i++) for(int j=0;j<=m+1;j++) a[i][j]='X'; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%c",&a[i][j]); if(a[i][j]=='S'){ stx=i;sty=j; sum++; }else if(a[i][j]=='D'){ enx=i;eny=j; sum++; }else if(a[i][j]=='.') sum++; } getchar(); } if((dis(stx,sty)+t)%2==0&&dfs(stx,sty,0,sum))//奇偶剪枝 printf("YES\n"); else printf("NO\n"); }}
0 0
- HDU 1010
- HDU 1010
- hdu 1010
- hdu 1010
- HDU 1010
- HDU 1010
- hdu 1010
- hdu-1010
- hdu 1010
- hdu 1010
- HDU 1010
- hdu 1010
- hdu 1010
- hdu-1010
- hdu-1010
- hdu 1010
- HDU 1010
- (1010)HDU
- stl string 源代码分析
- vs调试中的即时窗口Immediate Window
- Opencv3.1.0+opencv_contrib配置及使用SIFT测试
- ES6中的箭头函数的定义和调用方式
- 我读过的最好的epoll讲解--转自”知乎“
- HDU 1010
- IT项目管理-项目组合、项目群、项目
- 每天一个linux命令(3):pwd命令
- java爬取网页内容 简单例子(2)——附jsoup的select用法详解
- Git命令
- 初学C语言:比较交换3个实数值大小,并按序输出
- 浅谈进程和线程
- rz -be 从windows上发送二进制文件
- JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止