HDU1010【走迷宫】Tempter of the Bone-------2015年1月26日

一:题意描述

本题大致意思是讲给定一个迷宫(N*M),起点(s)和终点(D),现在要求在给定的步数(T)下从起点走到终点。要求是每一个点只能走一次。

二:题目分析

考虑到数据比较小,我们完全可以利用dfs去暴力出来,但是对于本题我想说一个很特别的技巧就是奇偶剪枝:对于任何一个可能的路径,我们都可以看做是S与D的最短距离

MIN=abs(sx-dx)+abs(dx-dy)+一个偶数。对于我们为何加一个偶数?我们可以这样想:我们既然是加了最短距离,那么当我们从某一个点偏离最短路长的时候必定重新回到偏离的那个点,那么走过的路长一定是偶数。

根据数据的加减性质:偶数+奇数=奇数;偶数+偶数=偶数

所以我们只要判断T和MIN是否同时奇数或者偶数即可,那么这样可以节省很多时间。如果是相同的话,才进行下一步的DFS,在用DFS时同样可以剪枝。

三:AC代码

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
#define maxn 8
char maps[maxn][maxn];
int T;
int dfs(int x,int y,int len)
{
    if(maps[x][y]==‘D‘)
    {
        if(len==T)  return 1;
        else if(len!=T) return 0;
    }
    else
    {
        if(len>=T) return 0;
        else
        {
            if(maps[x][y-1]!=‘X‘)
            {
                maps[x][y]=‘X‘;
                if(dfs(x,y-1,len+1)) return 1;
                maps[x][y]=‘.‘;
            }
             if(maps[x][y+1]!=‘X‘)
            {
                maps[x][y]=‘X‘;
                if(dfs(x,y+1,len+1)) return 1;
                maps[x][y]=‘.‘;
            }
             if(maps[x+1][y]!=‘X‘)
            {
                maps[x][y]=‘X‘;
                if(dfs(x+1,y,len+1)) return 1;
                maps[x][y]=‘.‘;
            }
             if(maps[x-1][y]!=‘X‘)
            {
                maps[x][y]=‘X‘;
                if(dfs(x-1,y,len+1)) return 1;
                maps[x][y]=‘.‘;
            }
        }
        return 0;
    }

}
int main()
{
    int m,n;
    while(cin>>n>>m>>T)
    {
        if(!n&&!m&&!T) break;
        int step=0;
        int sx,sy;
        memset(maps,‘X‘,sizeof(maps));
        for(int i=1;i<=n;i++)//初始化矩阵
            for(int j=1;j<=m;j++)
        {
            cin>>maps[i][j];
            if(maps[i][j]==‘S‘)
            {
                sx=i;sy=j;
            }
        }
        if((abs(ex - sx) + abs(ey - sy) - T)&1)
        {
            cout<<"NO"<<endl;
            continue;
        }
        else
        {
          if(dfs(sx,sy,step)) cout<<"YES"<<endl;
           else cout<<"NO"<<endl;
        }

    }
    return 0;
}

四:总结

在以后的题目中一定要注意学会仔细分析问题抓住本质,进而简化分析。

时间: 2024-11-03 01:32:46

HDU1010【走迷宫】Tempter of the Bone-------2015年1月26日的相关文章

2015年10月26日作业

高级学员:2015年10月26日作业 一.PMI权限(授权)管理基础设施 1.访问控制包括哪2个重要过程,及内容: 访问控制包括两个重要过程: 1.认证过程,通过"鉴别"来验证主题的合法身份: 2.授权管理,通过"授权"来赋予用户对某项资源的访问权限: 2.简述PMI与PKI有何不同? 哪个是"你能做什么",哪个是"你是谁" PMI主要进行授权管理,证明这个用户有什么权限,能干什么,即"你能 做什么" PK

我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算是有一点基础.但在这里我要保持空杯心态,一切从头开始.好了不多说,Let's Python!!!! 一.Python简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言.目前Python已经成为实际上除了中国最流行的开发语

中级学员:2015年10月26日作业

中级学员:2015年10月26日作业一.变更管理1.变更的工作程序:2.变更初审的4条内容:3.对进度变更控制,包括哪些主题.二.安全管理1.哪些技术来实现信息的保密性:2.哪些技术来实现信息的完整性:3.哪些技术来实现信息的可用性:4.可靠性的定义,及度量方法.5.应用系统常用保密技术有哪些?6.保障应用系统完整性的方法有哪些?7.机房供配电分为哪8种:8.紧急供电.稳压供电的内容:9.应用系统运行中,涉及4个层次的安全,这4个层次的安全,按粒度从粗到细进行排列:10.哪些属于系统级安全:11

我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

1 #!/usr/bin/env python3 2 # coding:utf-8 3 ''' 4 Created on: 2015年12月29日 5 6 @author: 张晓宇 7 8 Email: [email protected] 9 10 Version: 1.0 11 12 Description: 输入用户名密码,认证成功显示欢迎信息,认证失败,输错三次后锁定 13 14 Help: 15 ''' 16 import os 17 # 定义用户信息写入函数,用于把用户信息写回文件 1

我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)

#!/usr/bin/env python3 # coding:utf-8 ''' Created on: 2015年12月30日 @author: 张晓宇 Email: [email protected] Version: 1.0 Description: 三层菜单 1.菜单一共三级即:省,市,区县 2.每一级菜单输入的如果输入的是菜单里的选项则进入下级菜单 3.第1级菜单输入q退出系统 4.第2.3级菜单输入q退出系统,输入b返回上级菜单 5.三级菜单全部正确打印最后的全部选择结果,否则继续

我的Python成长之路---第一天---Python基础(2)---2015年12月26日(雾霾)

三.数据类型 Python基本类型(能够直接处理的数据类型有以下几种)主要有5种 1.整数(int) Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 2.浮点数(float) 浮点数也就是数学中的小数.由于整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的,而浮点数运算则可能会有四舍五入的误差.需要注意. 3.字符串 字符串是以单引号'或双引号"括起来的任意文本,比如'abc',"xy

2015年11月26日 Java基础系列(六)正则表达式Regex

package com.demo.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Administrator * */ public class RegexMatches { public static void main(String[] args) { String line="This order was placed for QT3000! OK?"; St

2015年11月26日 Java基础系列(一)之String与StringBuffer与StringBuilder的区别

序,StringBuffer是线程安全的,StringBuilder是线程不安全的,但是StringBuilder操作速度快,因此在使用时要根据场景合理选择. StringBuffer和StringBuilder都是可变字符串,当对字符串的操作更多是在添加.删除或更换子串的操作,则用StringBuffer或StringBuilder. String是一个类,实现了 Serializable, Comparable<String>, CharSequence. 一.String类 1 创建St

2015年11月26日 Java基础系列(三)ThreadLocal类初级学习

序,ThreadLocal类是为了解决多线程的安全问题.线程安全的意思也就是说每个线程操作自己的变量,不要对其他线程的值造成影响. 在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性. 1 ThreadLocal解决多线程安全问题的思路是通过ThreadLocalMap进行管控,就像一个Map中存在多个键值对,ThreadLocalMap可以对比Map进行理解. 2 一般通过覆盖ThreadLocal的init

高级:2015年10月26日作业

一.PMI权限(授权)管理基础设施 1.访问控制包括哪2个重要过程,及内容: 1)认证过程,通过"鉴别(authentication)"来检验主体的合法身份. 2)授权管理,通过"授权(authorization)"来赋予用户对某项资源的访问权限. 2.简述PMI与PKI有何不同?哪个是"你能做什么",哪个是"你是谁" PMI主要进行授权管理,证明这个用户有什么权限,能干什么,即"你能做什么". PKI主要