杭电 HDU 1010 Tempter of the Bone

来源:互联网 发布:淘宝卖家子账号设置 编辑:程序博客网 时间:2024/05/16 09:09

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1010


问题:在 N*M的迷宫里,小狗要在‘S’的位置,要再第T秒到达出口 'D'  (1 < N, M < 7; 0 < T < 50)。 即求存在路径,果断深搜DFS。


限制条件及剪枝:

1、走过的地方 ‘ . ’不能再走

2、不能通过墙‘X’

3、不能离开地图范围

4、可根据狗到门的最短距离和时间相比较,当时间与最短步骤都为奇数或偶数时,才有可能到达门处,否则永远无法正好在T秒到达门处。(奇偶剪枝,能去掉很多情况,减少时间)

5、找到任何一条存在路径后即可结束搜索并输出。(减少多余的搜索)


一开始第四点没有想到,总是超时,估计没有想到第四点的绝大多数都会超时的。


AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;struct Node{    int x,y;    int time;};char map[10][10];int t;bool yorn;int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};void Dfs(Node now){ //   printf("%d %d %d %d %c\n",now.x,now.y,now.time,yorn,map[now.x][now.y]);    Node next;    char ch;    int i;    if(yorn)    {        return ;    }    if(now.time > t)    {        return ;    }    if(now.time == t)    {        if(map[now.x][now.y] == 'D')        {            yorn = 1;        }        return ;    }    for(i = 0; i < 4; i++)    {        next.x = now.x+dir[i][0];        next.y = now.y+dir[i][1];        next.time = now.time+1;        if(map[next.x][next.y] != 'X')        {            if(map[next.x][next.y] == '.')            {                map[next.x][next.y] = 'X';                Dfs(next);                map[next.x][next.y] = '.';            }            else            {                Dfs(next);            }        }    }}int main(){    int n,m,p;    int i,j,x,y;    Node now;    while(scanf("%d%d%d",&n,&m,&t))    {        if(n == 0 && m == 0 && t == 0)        {            break;        }        memset(map,'X',sizeof(map));  //初始化都为墙        yorn = 0;        for(i = 1; i <= n; i++)        {            for(j = 1; j <= m; j++)            {                cin >> map[i][j];                if(map[i][j] == 'S')                {                    now.x = i;                    now.y = j;                }                if(map[i][j] == 'D')                {                    x = i;                    y = j;                }            }        }        now.time = 0;        p = abs(now.x-x) + abs(now.y-y);        map[now.x][now.y] = 'X';//        printf("%d\n",yorn);        if(p%2 == t%2)    //时间和需要走的步骤都为奇数或偶数则搜索(奇偶剪枝)        {            Dfs(now);        } //       printf("%d\n",yorn);        if(yorn > 0)        {            printf("YES\n");        }        else        {            printf("NO\n");        }    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泰迪吃草又呕吐怎么办 手机不断收到验证码信息怎么办 樱桃吃多了上火怎么办 过年不想回婆婆家过怎么办 旅行箱提手坏了怎么办 影棚人物后面有影子怎么办 微信运动图标不见了怎么办 逆光拍摄人黑了怎么办 单反镜头刮花了怎么办 股东各50股份不同意退股怎么办 退股没有协议他不愿意退钱怎么办 s7刷机有三星帐号id怎么办 做主播留不住人怎么办 直播间留不住人怎么办 淘宝直播间留不住人怎么办 干了一个月不发工资怎么办 16岁长白色头发怎么办 腾讯乘车码解约了怎么办 蓝洞棋牌客封号怎么办 草莓被蚂蚁吃了怎么办 脖子被种了草莓怎么办 2岁的宝宝说脏话怎么办 欠钱的人跑路了怎么办 美国非婚生子父亲不认怎么办 孕4个月肚子胀气怎么办 8个月孕妇感冒了怎么办 孕8个月感冒鼻塞怎么办 怀孕八个月感冒了怎么办 孕八个月咳嗽了怎么办 享物说同城自提怎么办 锤基意外怀孕怎么办 08 蛐蛐罐底翻砂了怎么办 剑网3中被盗号后怎么办 本人想离婚对方躲避怎么办 微信不能说语音怎么办 微信语音发不了怎么办 吃鸡语音用不了怎么办 要杀我的人见面怎么办 转晕了想吐怎么办 原地转圈头晕恶心想吐怎么办 孩子吃凉的呕吐头还晕怎么办