HDU 1010(Tempter of the Bone)

/*DFS
Date: 2012/10/12
题目链接地址:http://www.cnblogs.com/sorryhao/admin/EditPosts.aspx?opt=1
思路:从开始点找,一直找到门,这是判断时间是不是刚好t秒,如果是则输出YES,否则输出NO
需要注意的是奇偶剪枝

奇偶剪枝:http://baike.baidu.com/view/7789287.htm
*/

#include<iostream>
#include<cmath>
using namespace std;
#define maxn 8
char matrix[maxn][maxn];
int n,m,t,si,sj,ei,ej,sum;
int dir[4][2] = {-1,0,1,0,0,1,0,-1};
bool  flag;
bool ok(int i,int j)
{
    return i >= 1 && i <= n && j >= 1 && j <= m && matrix[i][j] != 'X';
}
void dfs(int x,int y,int num)
{
    int i,px,py;
    if(flag)  return;          //已经找到后,无需再继续找下去
    if(x == ei && y == ej && num == t)
    {
        flag = 1;
        return;
    }
    if(num > t)   return;
    matrix[x][y] = 'X';
    for(i = 0; i < 4; i++)
    {
        px = x + dir[i][0],py = y + dir[i][1];
        if(ok(px,py))
            dfs(px,py,num+1);
    }
    matrix[x][y] = '.';
}
int main()
{
    //freopen("1008.txt","r",stdin);
    while(scanf("%d%d%d",&n,&m,&t) && (n||m||t))
    {
        int i,j;
        sum = 0,flag = false;
        for(i = 1; i <= n; i++)
            for(j = 1; j <= m; j++)
            {
                cin >> matrix[i][j];
                if(matrix[i][j] == 'S')
                    si = i,sj = j,matrix[i][j] = 'X';
                else if(matrix[i][j] == 'D')
                    ei = i, ej = j,matrix[i][j] = '.';
                else if(matrix[i][j] == '.')
                    sum++;
            }
        if((ei+ej+si+sj)%2 != t%2 || sum+1 < t)   //奇偶剪枝,也可写为(abs(si-sj)+abs(ei-ej)-t%2 ,可以走的路数小于t
        {
            printf("NO\n");
            continue;
        }
        else dfs(si,sj,0);
        if(flag)  printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

posted @ 2012-10-12 21:57  sorryhao  阅读(152)  评论(0)    收藏  举报