码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1010 搜索 奇偶剪枝

时间:2020-11-08 17:14:10      阅读:17      评论:0      收藏:0      [点我收藏+]

标签:else   奇偶剪枝   using   pause   size   std   memset   lan   lse   

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

char map[8][8];
int n, m, t;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool visit[8][8];
int xx, yy;
bool ans = false;

void dfs(int x, int y, int cnt)   //位置 时间
{
    visit[x][y] = true;
    if(map[x][y] == ‘D‘ && cnt == t)
    {
        ans = true;
        return;
    }

    if(cnt>=t) return;

    for(int i = 0; i < 4; i++)
    {
        int xt = x+dir[i][0];
        int yt = y+dir[i][1];
        if(xt >= 1 && xt <= n && yt >= 1 && yt <= m && map[xt][yt] != ‘X‘ && !visit[xt][yt])
        {
            dfs(xt, yt, cnt+1);
            visit[xt][yt] = false;
            if(ans) return;
        }
    }
}

int main()
{
    int x, y;
    while(cin >> n >> m >> t && n+m+t)
    {
        ans = false;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                cin >> map[i][j];
                if(map[i][j] == ‘S‘) x = i, y = j;
                if(map[i][j] == ‘D‘) xx = i, yy = j;
            }
        }

        //剪枝
        int tmp = t-abs(xx-x)-abs(yy-y);
        if(abs(x-xx)+abs(y-yy) > t || tmp&1) //距离过大 和 奇偶剪枝
        {
            cout << "NO" << endl;
            continue;
        }

        memset(visit, false, sizeof visit);
        dfs(x, y, 0);  

        if(ans) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    system("pause");
    return 0;
}

HDU 1010 搜索 奇偶剪枝

标签:else   奇偶剪枝   using   pause   size   std   memset   lan   lse   

原文地址:https://www.cnblogs.com/znk97/p/13942638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!