HDU 1010— DFS+奇偶剪枝
来源:互联网 发布:java对数学要求 编辑:程序博客网 时间:2024/04/29 11:51
直接上DFS会超时 所以需要用到剪枝
这道题也就是用到了奇偶剪枝
奇偶剪枝:
现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点,
s
|
|
|
+
—
—
—
e
如图所示(“|”竖走,“—”横走,“+”转弯),易证abs(ex-sx)+abs(ey-sy)为此问题类中任意情况下,起点到终点的最短步数,记做step,此处step1=8;
s
—
—
—
—
—
+
|
+
|
+
—
—
—
e
如图,为一般情况下非最短路径的任意走法举例,step2=14;
step2-step1=6,偏移路径为6,偶数(易证);
若 t-[abs(ex-sx)+abs(ey-sy)] 结果为非偶数(奇数),则无法在t步恰好到达;
返回,false;
反之亦反。
#include <stdio.h>#include <iostream>#include <algorithm>#include <cstdlib>#include <cstring>using namespace std;int a[4][2]={{0,-1},{0,1},{1,0},{-1,0}};char ch[8][8];int n,m,t;int flag,ans;int sx,sy,ex,ey;void dfs(int x,int y,int tmp){if(tmp==t){if(ex==x&&ey==y)flag=1;return ;}if(flag) return;//奇偶剪枝int k=abs(ex-x)+abs(ey-y)-abs(tmp-t);if(k>0||k&1) return ;for(int i=0;i<4;i++){int fx=x+a[i][0];int fy=y+a[i][1];if(fx>=0 && fx<n && fy>=0 && fy<m && ch[fx][fy]!='X'){ch[fx][fy]='X';dfs(fx,fy,tmp+1);ch[fx][fy]='.';}}}int main(){freopen("in.in","r",stdin);while(scanf("%d %d %d",&n,&m,&t)!=EOF&&(n||m||t)){flag=0;ans=0;for(int i=0;i<n;i++){scanf("%s",&ch[i]);for(int j=0;j<m;j++){if(ch[i][j]=='S'){sx=i;sy=j;}else if (ch[i][j]=='D'){ex=i;ey=j;}else if(ch[i][j]=='.'){ans++;}}}//对图中点的数量加1 小于给定的情况 进行剪枝if(ans+1<t){printf("NO\n");continue;}ch[sx][sy]='X';dfs(sx,sy,0);if(flag){printf("YES\n");}else{printf("NO\n");}}return 0;}
0 0
- HDU 1010— DFS+奇偶剪枝
- hdu 1010 dfs+奇偶剪枝
- HDU 1010(dfs+奇偶剪枝)
- HDU 1010 DFS+奇偶剪枝
- hdu 1010 dfs,奇偶剪枝
- hdu 1010 dfs+奇偶剪枝
- DFS 奇偶剪枝 HDU 1010
- hdu 1010 dfs+奇偶剪枝
- HDU 1010 dfs+奇偶剪枝
- hdu 1010 dfs(奇偶剪枝)
- HDU 1010( DFS+奇偶剪枝)
- HDU-1010(DFS+奇偶剪枝)
- DFS深搜 + 奇偶剪枝 HDU-1010
- DFS专攻:HDU 1010(DFS+奇偶剪枝)
- hdu 1010 奇偶剪枝
- hdu 1010 奇偶剪枝
- HDU 1010 Tempter of the Bone - (DFS) 奇偶剪枝
- HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
- sgu213:Strong Defence(分层图构造)
- 需求的鉴别与分析
- HDU_5199
- hbase 访问zookeeper的问题 坑
- 斐波那契数列
- HDU 1010— DFS+奇偶剪枝
- 平衡二叉树
- 设计模式(13)——责任链(Chain of Responsibility)
- 单调栈
- akoj-1148-小光棍数
- 点击界面产生气泡,气泡效果~
- 阿里巴巴2015基础平台研发工程师实习生笔试卷
- OJ题——狐狸算卦
- Jquery基础之DOM操作