• HDU 1010 Tempter of the Bone


    题意:从开始位置走到结束位置,恰好走 t 步 YES

    否则 NO

    搜索题,由于是恰好走到,所以用到了奇偶剪枝

    什么是奇偶剪枝,我也是刚知道

    所给步数为 t ,起始位置坐标 (begin_x,begin_y), 结束位置坐标 (end_x,end_y)

    两位置最短距离为 ju = abs(end_x - begin_x) + abs(end_y - begin_y)

    若 t - ju 为奇数,则无论如何不能恰好走到

    为偶数才有可能恰好走到

    代码中 pos + dis 即 ju

    代码如下:

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int m,n,t;
    char map[8][8];
    int vis[8][8];
    int flag;
    int begin_x,begin_y,end_x,end_y;
    int p[][2] = {{-1,0},{0,1},{1,0},{0,-1}};  //偏移量:上,下,左,右
    void dfs(int x,int y,int pos)             //pos 为当前已走步数
    {
        if(flag) return ;                  //剪枝:已经到达目的地
        if(pos > t) return ;               //剪枝:步数超过 t
        if(x == end_x && y == end_y && pos == t)  //恰好 t 步走到
        {
            flag = 1;
            return ;
        }
        int dis = abs(end_x - x) + abs(end_y - y);  //当前位置到结束位置的最短距离
        if((t - dis - pos) % 2 != 0) return;       //奇偶剪枝,很重要,不剪TLE
        for(int i = 0; i < 4; i ++)         //搜索四个方向
        {
            int tx = x + p[i][0];
            int ty = y + p[i][1];
            if(tx >= 0 && tx < m && ty >= 0 && ty < n && !vis[tx][ty] && map[tx][ty] != 'X')
            {
                vis[tx][ty] = 1;
                dfs(tx,ty,pos + 1);
                vis[tx][ty] = 0;
            }
        }
    }
    int main()
    {
        while(~scanf("%d%d%d",&m,&n,&t) && (m || n || t))
        {
            memset(vis,0,sizeof(vis));
            flag = 0;
            int k = 0;
            for(int i = 0; i < m; i ++)
            {
                for(int j = 0 ; j < n; j++)
                {
                    cin>>map[i][j];             //scanf注意回车
                    if(map[i][j] == 'S')
                    {
                        begin_x = i;
                        begin_y = j;
                        vis[i][j] = 1;
                    }
                    if(map[i][j] == 'D')
                    {
                        end_x = i;
                        end_y = j;
                    }
                    if(map[i][j] == 'X')
                        k ++;
                }
            }
            if((m * n - k) > t) dfs(begin_x,begin_y,0);
            if(flag) printf("YES
    ");
            else printf("NO
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    一周小记(十七)
    一周小记(十九)
    2021/12/28组会
    AdaIN论文阅读(Arbitrary Style Transfer in Realtime with Adaptive Instance Normalization)
    PostgreSQL新增、更新、删除触发器
    leetcodedphard最小距离
    leetcodedp编辑距离问题两个字符串的删除操作
    正向代理代理客服端,反向代理代理服务器
    mybatisplus逻辑删除 3.1一下版本
    Eclipse使用指定JDK,无需配置Path变量
  • 原文地址:https://www.cnblogs.com/Houheshuai/p/3711635.html
Copyright © 2020-2023  润新知