andre_joy

导航

hdu 1010

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1010

题意:迷宫,是否能恰好t步走到终点。

mark:奇偶剪枝法!!!这篇博客写的不错http://www.cppblog.com/Geek/archive/2010/04/26/113615.html

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n,m,t,sum,flag;
char a[10][10];
int s1,s2,d1,d2;
int tab[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};

int fab(int a) {return a < 0 ? -a : a;}

void dfs(int x, int y, int step)
{
    int temp = t-step-fab(d1-x)-fab(d2-y);
    if(temp < 0 || (temp & 1)) return ;
    for(int i = 0; i < 4; i++)
    {
        int xx = x+tab[i][0];
        int yy = y+tab[i][1];
        if(a[xx][yy] == 'D' && step == t-1) {flag = 1; return ;}
        if(xx >= 0 && xx < n && yy >= 0 && yy < m && a[xx][yy] == '.')
        {
            a[xx][yy] = 'X';
            dfs(xx, yy, step+1);
            a[xx][yy] = '.';
            if(flag) return ;
        }
    }
}

int main()
{
    int i,j;
    while(scanf("%d %d %d%*c", &n, &m, &t), n)
    {
        sum = 0;
        flag = 0;
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < m; j++)
            {
                scanf("%c", &a[i][j]);
                if(a[i][j] == 'S') s1 = i, s2 = j;
                if(a[i][j] == 'D') d1 = i, d2 = j;
                if(a[i][j] == 'X') sum++;
            }
            getchar();
        }
        if(n*m-sum > t) dfs(s1, s2, 0);
        puts(flag ? "YES" : "NO");
    }
    return 0;
}

posted on 2012-08-29 14:31  andre_joy  阅读(103)  评论(0编辑  收藏  举报