HDUOJ-1010 Tempter of the Bone(深搜+剪枝优化)

一开始没仔细看题(英文渣),一扫样例,这不广搜嘛,然后血崩。
认真翻译了一遍。然后用深搜写,然后在一个小错误上面卡了4个小时。。
终于AC了。。
其实个人感觉用广搜也不是不可以,只是超时。。

思路

递归函数:模拟每一步状态,递归函数开头写终止条件,然后更新坐标值,判断是否是墙或走过的路,然后把坐标代入下一层递归。

剪枝

1、这里的MinStep为曼哈顿距离“两点在南北方向上的距离加上在东西方向上的距离”,是本题中两点间的最短步数(时间)
如果MinStep比给定的T大,显然狗不能到达。abs()为返回绝对值函数

int MinStep = abs(endx-beginx) + abs(endy-beginy);
      if(MinStep > t){
          cout<<"NO"<<endl;
          continue;   
}

2、奇偶剪枝,详见百度百科“奇偶剪枝"

if( abs(t - MinStep) % 2 == 1){
          cout<<"NO"<<endl;
          continue;

}

3、 把效率提升10倍的很厉害的优化。。(原理:步数t和墙数wall的和一定比迷宫面积大)

if(n*m-wall <= t)   //436ms->46ms
      {
        cout<<"NO" <<  endl;
        continue;
      }   

下面贴上自己的渣翻译,虽然比机翻人性化一点。。

Problem Description

小狗在一个古老的迷宫找到了骨头,它很欢喜,当它捡起的时候,迷宫地动山摇。它意识到这是一个陷阱,它拼命的想走出这个迷宫,等待它的命运将是什么呢?
迷宫是长方形(N*M)。门为迷宫的出口。一开始门是关着的,它会在T秒时,短时间打开(小于1秒)。因此小狗必须准确的在T秒到达门处。
每秒小狗可以移动一个格子。每次它到达一个格子,这块格子会在下一秒下沉。它不能在一个格子停留超过1秒,也不能去已经访问过的格子。
小狗可以逃出生天吗?帮帮它。

Input

输入多组测试数据。第一行3个整数 N,M,T(1 < N, M < 7, 0 < T < 50 ), 分别表示迷宫的宽、长、门打开的时间。接下来N行表示迷宫的布局,每行有M个字符。字符含义如下:
'X': 墙,小狗不能通过
'S': 起点
'D': 门
'.': 普通格子
'0 0 0'来终止输入

Output

每组数据用"YES"表示小狗可以存活,反之"NO"

Sample Input

4 4 5
S.X.
..X.
..XD
....
3 4 5�0AS.X.
..X.
...D
0 0 0

Sample Output

NO
YES

AcceptCode

/*
* created by zsdostar
* 2016/5/1
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int abs(int fx);
void dfs(int x,int y,int step);

char maze[51][51],book[51][51];
int endx,endy;
int n,m,t,flag,wall;

int main()
{
    int beginx,beginy,step=0;
    while(cin>>n>>m>>t)
    {
      if(n==0 && m==0) break;
      flag = 0;wall = 0;
      memset(book,0,sizeof(book));//mdzz,废了一下午时间在这上面。。结果原因是每次book没有初始化,导致下一组数据会读取上一组book代表的状态。。泪崩
      for(int i=0;i<n;i++)
      {
        for(int j=0;j<m;j++)
        {
            cin>>maze[i][j];
            if(maze[i][j]=='S') { beginx = i; beginy = j; }
            else if(maze[i][j]=='D'){ endx = i; endy = j; }
            else if(maze[i][j]=='X'){ wall++; book[i][j] = 1; }
        }
      }

      if(n*m-wall <= t)//436ms->46ms
      {
        cout<<"NO"<<endl;
        continue;
      }
      int MinStep = abs(endx-beginx) + abs(endy-beginy);
      if(MinStep > t){
          cout<<"NO"<<endl;
          continue;
      }
      if( abs(t - MinStep) % 2 == 1){
          cout<<"NO"<<endl;
          continue;
      }

      book[beginx][beginy]=1;
      dfs(beginx,beginy,step);
      if(flag)
          cout<<"YES"<<endl;
      else
          cout<<"NO"<<endl;
    }
}
int abs(int fx)
{
  if(fx<0)
    fx=-fx;
  return fx;
}
void dfs(int x,int y,int step)
{
    if(x<0||x>=n||y<0||y>=m)//数组边界检测
    {
      return;
    }
    int next[4][2]{{0,1},{1,0},{0,-1},{-1,0}};//上下左右
    if(x==endx && y==endy)
    {
        if(step==t)
          flag=1;
    }
    if(flag)
        return;
    int tx,ty,k;
    for(k=0;k<=3;k++)//遍历上下左右
    {
        tx = x + next[k][0];
        ty = y + next[k][1];

        if(book[tx][ty] == 0)//如果不撞墙,不是已走过的路,就进入更深层的dfs()
        {
            book[tx][ty] = 1;
            dfs(tx,ty,step+1);
            book[tx][ty] = 0;
            if(flag)
                return;
        }
    }
    return;
}

谨慎谨慎再谨慎。。不然错误找出来简直发现自己智障。。
再吐槽新版编辑器,bug好多。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,320评论 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,027评论 0 2
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,621评论 0 89
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,755评论 0 6
  • 老將行軍飲馬窟,嬌娥問闕一躍鳳。 縱有大道千重色,更待素秋飾繁城。 咸陽橋上中男別,樂遊原裏錦情綿。 戎馬征戰何時...
    珠峰看旗云阅读 149评论 0 1