DFS专攻:HDU 1010(DFS+奇偶剪枝)

原创 2013年12月03日 13:04:37

这题有点脑人滴,因为好久不练习DFS了,几乎不会做了,所以要专攻一下才行。直接写的DFS超时了两发,唉,不得已看了别人的,然后别人都是奇偶剪枝,以前没有学过这个,不知道剪枝是啥意思。然后又多看了几个人的博客,别人写得不清不楚,也没看明白是啥意思。然后直接百度百科……没想到里面真是想得好清楚,彻底理解奇偶剪枝是什么回事了!

奇偶剪枝百度百科学习网站:http://baike.baidu.com/link?url=4GHqaNcncZrCnBnjYPOBg66lQ68HcSajeAro7_QVfDX3lyED_MyfNwc0MqxoOO3eIbWIMeWfU6k0UAr2U1ZvCq

这周专攻的第一道DFS终于领会了……继续努力!

剪枝的目的就是要省时……

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
int n,m,t,xx,yy,k,d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[10][10];
void dfs(int x,int y,int tt)
{
    if(k) return;  //如果前面已经有符合的话就不用再往下判断了
    if(tt==t)
    {
        if(xx==x&&yy==y) {k=1;return;}
        return;
    }
    int tem=abs(x-xx)+abs(y-yy)-abs(tt-t);  //所走步数与奇偶剪枝的判断式
    if(tem>0||tem&1) return;  //步长如果大于剩余的步长肯定不会在特定的步数走到啦;然后奇数的剪掉。
    for(int i=0;i<4;i++)
    {
        int x2=x+d[i][0];
        int y2=y+d[i][1];
        if(x2>=0&&x2<n&&y2>=0&&y2<m&&map[x2][y2]!='X')
        {
            map[x2][y2]='X';   //走的过程可能回到这点,所以先变成墙
            dfs(x2,y2,tt+1);
            map[x2][y2]='.';   //回溯
        }
    }
}
int main()
{
    int i,j,x,y;
    while(scanf("%d%d%d",&n,&m,&t)&&(n||m||t))
    {
        int w=0;
        for(i=0;i<n;i++)
        {
            scanf("%s",map[i]);
            for(j=0;j<m;j++)
            {
                if(map[i][j]=='S') {x=i;y=j;}
                else if(map[i][j]=='D') {xx=i;yy=j;}
                else if(map[i][j]=='X') w++;
            }
        }
        if(m*n-w<=t) {printf("NO\n");continue;}  //如果可以走的块数比t还小,那这种情况也肯定不行
        k=0;
        map[x][y]='X';
        dfs(x,y,0);
        if(k) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


相关文章推荐

hdu 1010 dfs+奇偶剪枝

题目链接:点击打开链接 放张图片吧……心态最重要 开始以为简单的dfs模板题,用c++写,方向数组名为next,然后n次编译错误,我也是很绝望...

HDU-1010(DFS+奇偶剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010思路: 题目思路很清晰,一眼能看出用DFS来做,难点在于如果不剪枝就会超时。 这题对我来说最大...
  • robin_8
  • robin_8
  • 2016年12月17日 15:39
  • 153

hdu1010Tempter of the Bone(dfs+奇偶剪枝)

题目链接:点击打开链接 题目描述:给定一个迷宫,给一个起点和一个终点,问能否恰好经过T步到达终点?每个格子不能重复走 解题思路:dfs+剪枝 剪枝1:奇偶剪枝,判断终点和起点的距离与T的奇偶性是...

HDU 1010 DFS+奇偶剪枝

Tempter of the Bone DFS+奇偶剪枝

hdu1010 Tempter of the Bone(dfs+奇偶剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 第二次做这个题目了,结果没仔细读题,直接就BFS了, 原来是求是否恰好在T 秒逃出迷宫, ...

HDU 1010 Tempter of the Bone (DFS + 奇偶剪枝)

DescriptionThe doggie found a bone in an ancient maze, which fascinated him a lot. However, when he ...

hdu1010 (dfs+奇偶剪枝)

hdu1010 关于奇偶剪枝:下面给出一个奇偶矩阵 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0我们观察到: 如果从标记有0的位置到标记有1...

hdu-1010 Tempter of the Bone(DFS+奇偶剪枝)

hdu-1010 Tempter of the Bone(DFS+奇偶剪枝)题目描述 Tempter of the Bone Time Limit: 2000/1000 MS (Java...

HDU 1010 Tempter of the Bone (DFS+奇偶剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe...

HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)

明显的BFS却用DFS……只是为了训练思想了~ 神奇的奇偶剪枝~
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DFS专攻:HDU 1010(DFS+奇偶剪枝)
举报原因:
原因补充:

(最多只允许输入30个字)