HDU 1010 搜索 奇偶剪枝

Posted znk97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1010 搜索 奇偶剪枝相关的知识,希望对你有一定的参考价值。

#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 搜索 奇偶剪枝的主要内容,如果未能解决你的问题,请参考以下文章

HDU1010-奇偶剪枝(DFS)

hdu1010:Tempter of the Bone

hdu1010 - dfs,奇偶剪枝

hdu1010Tempter of the Bone(dfs+奇偶剪枝)

hdu1010 Tempter of the Bone---DFS+奇偶剪枝

HDU - 1010 (DFS回溯法 + 奇偶剪枝)