HDU 1010 【搜索+奇偶剪枝】
2015-09-11 19:57
471 查看
0 0,,之前纠结了很久的一道题,今天上网翻了一下答案,发现是用搜索做的,然后发现现在对于搜索已经没有想法了。。。TAT,当初最好的难道不是搜索吗!!我以为我搜索好歹是入门了,但是居然不知道奇偶剪枝。。QAQ
#include <cstdio> #include <cstring> #include <iostream> #include <string> using namespace std; int n,m,t; int flag,ji; int sx,sy,ex,ey; char a[10][10]; int vis[10][10]; int cmpx[4]={0,0,1,-1}; int cmpy[4]={1,-1,0,0}; bool check(int x,int y,int rem) { if(x<0||x>=n||y<0||y>=m) return false; if(a[x][y]=='X'||vis[x][y]) return false; int d=abs(x-ex)+abs(y-ey); if((d&1)!=(rem&1)) return false; return true; } void search(int x,int y,int d) { //printf("tx=%d ty=%d\n",x,y); if(flag||d>t) return; if(a[x][y]=='D') { if(d==t) flag=1; return; } vis[x][y]=1; for(int i=0;i<4;i++) { int tx=x+cmpx[i],ty=y+cmpy[i]; if(!check(tx,ty,t-d-1)) continue; search(tx,ty,d+1); } vis[x][y]=0; } int main() { while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(!n&&!m&&!t) break; int tmp=0; for(int i=0;i<n;i++) { scanf("%s",a[i]); for(int j=0;j<m;j++) { if(a[i][j]=='S') sx=i,sy=j; else if(a[i][j]=='D') ex=i,ey=j; if(a[i][j]=='X') tmp++; vis[i][j]=0; } } int d=abs(sx-ex)+abs(sy-ey); if((d&1)!=(t&1)||n*m-tmp<=t) {printf("NO\n");continue;} flag=0; ji=(d&1); search(sx,sy,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- iOS 面试题
- vs中文注释会有红色波浪线错误标识
- ios 设置cell的selectedBackgroundView的大小
- 从零开始自学Swift(七)
- Heartbeat3安装
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- Java排序汇总
- 大数+同余模
- POJ 2051(最小堆/优先队列)
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- 本地与在线图片转Base64及图片预览
- 第八章 多态(上)
- javaScript定义对象的方法
- Android Canvas 与 View之间的关系
- 得到重复的数字
- iOS 一些常见问题
- bzoj4247 挂饰
- RMS 谈软件的“货币化”,软件即服务、智能手机和隐私