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;
}


DFS之奇偶性剪枝

奇偶剪枝 【问题描述:】 给定一个N*M的迷宫以及起点和终点,迷宫中有一些障碍无法穿过,问能否不重复也不停留地在刚好一共走T步出迷宫。   【问题分析:】 先来看下这张图片: 也就是说当要走偶数...
  • i1020
  • i1020
  • 2017年02月08日 00:02
  • 446

HDU 1010( DFS+奇偶剪枝)

0 1 0 1 0 11 0 1 0 1 00 1 0 1 0 11 0 1 0 1 00 1 0 1 0 1 从 0->1 需要奇数步从 1->0 需要偶数步那么设所在位置 (si,sj) 与 目标...
  • start0609
  • start0609
  • 2012年07月24日 11:29
  • 556

HDU 1010 DFS+奇偶剪枝

Tempter of the Bone DFS+奇偶剪枝
  • guodongxiaren
  • guodongxiaren
  • 2014年04月14日 14:08
  • 2089

hdu 1010 dfs+奇偶剪枝

http://acm.hdu.edu.cn/showproblem.php?pid=1010 一开始看7*7以为不需要进行剪枝结果。妥妥的超时了。。跑去学习了下奇偶剪枝法。。主要的思想就是当前点到终...
  • liujc_
  • liujc_
  • 2015年03月26日 15:06
  • 478

HDU 1010(DFS+奇偶剪枝)

题目链接:点击打开链接 题目大意:输入一个n*m的地图,问从S到D刚好走k步能否成立。 大体思路:BFS是针对最短路径的方法,这道题看似是用BFS,实际上用DFS更好一些。这道题目...
  • toohandsomeIeaseId
  • toohandsomeIeaseId
  • 2018年02月01日 16:50
  • 11

HDU 1010(dfs+奇偶剪枝)

题意: 'X': a block of wall, which the doggie cannot enter;  'S': the start point of the doggie;  'D...
  • u013220054
  • u013220054
  • 2014年01月11日 14:14
  • 452

HDU 1010 dfs+奇偶剪枝

dfjhd #include #include #include #include #include #include #include #include #include using namespa...
  • m0_37667021
  • m0_37667021
  • 2017年09月14日 16:44
  • 79

HDU 1010— DFS+奇偶剪枝

直接上DFS会超时 所以需要用到剪枝 这道题也就是用到了奇偶剪枝 奇偶剪枝: 现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点, s ...
  • u013769121
  • u013769121
  • 2015年05月11日 21:53
  • 172

HDU - 1010(dfs +奇偶剪枝)

xdd 点击打开链接 (si,ji)、(h,w)分别为起点终点坐标。我们可使用的两种剪枝方案是: 如果所给的时间(步数) t 小于最短步数path,那么一定走不到。若满足t>path。但...
  • sinat_36215255
  • sinat_36215255
  • 2017年07月08日 23:01
  • 76

DFS 奇偶剪枝 HDU 1010

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth...
  • Singular__point
  • Singular__point
  • 2017年05月03日 07:50
  • 93
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DFS专攻:HDU 1010(DFS+奇偶剪枝)
举报原因:
原因补充:

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