hdu 1010 Tempter of the Bone

传说中的奇偶剪枝,但是这题的数据,在dfs前判断一下,可以变得很快。

171MS:

#include <math.h>
#include <iostream>

using namespace std;

 

#define MAX 10

const int dir[4][2]= {{0,1},{1,0},{-1,0},{0,-1}};

int N,M,T,di,dj;
char maze[MAX][MAX];
bool survive,visited[MAX][MAX];

 

void dfs(int i,int j,int t)
{
    if(survive==true) return;
    if(t==T)
    {
        if( i==di && j==dj )
            survive=true;
        return ;
    }
    else if( i==di && j==dj ) return;
    int x,y,k,min=fabs(double(di-i) )+fabs(double(dj-j));

    if( min > T - t ) return;  //最快的时间都不能走到,肯定完蛋了
    if( (T-t-min) & 1 ) return; // if(min % 2 != (T-t) % 2)//奇偶剪枝

    for(k=0; k<4; k++)
    {
        x=i+dir[k][0];
        y=j+dir[k][1];
        if( x<0 || x>=N || y<0 || y>=M) continue;
        if( !visited[x][y] && maze[x][y]!='X' )
        {
            visited[x][y]=true;
            dfs(x,y,t+1);
            visited[x][y]=false;
        }
    }
}

int main()
{
    while(scanf("%d %d %d",&N,&M,&T) && (N||M||T) )
    {
        getchar();
        int i,j,si,sj,xx=0;
        for(i=0; i<N; i++)
        {
            for(j=0; j<M; j++)
            {
                scanf("%c",&maze[i][j]);
                if(maze[i][j]=='S')
                {
                    si=i;
                    sj=j;
                }
                else if(maze[i][j]=='D')
                {
                    di=i;
                    dj=j;
                }
                else if(maze[i][j]=='X' )
                    xx++;
            }
            getchar();
        }

   //有这个判断,这题边剪枝都不用了
        if( N*M - xx -1< T)
        {
            printf("NO\n");
            continue;
        }
        memset(visited,false,sizeof(visited));
        survive=false;
        visited[si][sj]=true;
        dfs(si,sj,0);
        if( survive ) printf("YES\n");
        else printf("NO\n");
    }
}

 

//************************************************************************************************

同学问网上牛人拿的0MS的代码,超强!!!

#include <stdio.h>
#include <string.h>
const int dir[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};
const int MAX=8;
int n,m;
char map[MAX][MAX];
int dx,dy;
struct Struct_Q
{
    int x,y;
} q[1000000];
int used[MAX][MAX];
int vabs(int x)
{
    return x<0?-x:x;
}
int dis(int x,int y)
{
    return vabs(x)+vabs(y);
}
int BFS(int x,int y)
{
    int tx,ty,i,f=-1,r=0;
    memset(used,0,sizeof(used));
    used[x][y]=1;
    q[0].x=x;
    q[0].y=y;
    while(f!=r)
    {
        f++;
        x=q[f].x;
        y=q[f].y;
        for(i=0; i<4; i++)
        {
            tx=x+dir[i][0];
            ty=y+dir[i][1];
            if(tx==dx&&ty==dy)return 1;
            if(tx<0||tx>=n||ty<0||ty>=m||used[tx][ty])continue;
            if(map[tx][ty]=='X')continue;
            used[tx][ty]=1;
            r++;
            q[r].x=tx;
            q[r].y=ty;
        }
    }
    return 0;
}
int able(int x,int y)
{
    memset(used,0,sizeof(used));
    int i,f=-1,r=0,tx,ty,cnt=0;
    q[0].x=x;
    q[0].y=y;
    used[x][y]=1;
    while(f!=r)
    {
        f++;
        x=q[f].x;
        y=q[f].y;
        for(i=0; i<4; i++)
        {
            tx=dir[i][0]+x;
            ty=dir[i][1]+y;
            if(tx<0||tx>=n||ty<0||ty>=m||used[tx][ty])continue;
            if(map[tx][ty]=='X')continue;
            cnt++;
            used[tx][ty]=1;
            r++;
            q[r].x=tx;
            q[r].y=ty;
        }
    }
    return cnt;
}
int DFS(int x,int y,int t)
{
    int tx,ty,i;
    if(t==0)
    {
        return x==dx&&y==dy;
    }
    if(able(x,y)<t)return 0;
    if(BFS(x,y)==0)return 0;
    if(dis(x-dx,y-dy)>t)return 0;
    for(i=0; i<4; i++)
    {
        tx=x+dir[i][0];
        ty=dir[i][1]+y;
        if(tx<0||tx>=n||ty<0||ty>=m)continue;
        if(map[tx][ty]=='X')continue;
        map[tx][ty]='X';
        if(DFS(tx,ty,t-1))return 1;
        map[tx][ty]='.';
    }
    return 0;
}
int main()
{
    int T;
    int i,j,sx,sy;

    while(scanf("%d%d%d",&n,&m,&T)!=EOF)
    {
        if(!n&&!m&&!T)break;
        for(i=0; i<n; i++)
        {
            scanf("%s",map[i]);
            for(j=0; j<m; j++)
            {
                if(map[i][j]=='S')
                {
                    sx=i;
                    sy=j;
                }
                else if(map[i][j]=='D')
                {
                    dx=i;
                    dy=j;
                }
            }
        }
        map[sx][sy]='X';
        if((vabs(sx-dx)+vabs(sy-dy))%2!=T%2)
        {
            puts("NO");
            continue;
        }
        if(dis(sx-dx,sy-dy)>T)
        {
            puts("NO");
            continue;
        }
        if(BFS(sx,sy)==0)
        {
            puts("NO");
            continue;
        }
        if(DFS(sx,sy,T)) puts("YES");
        else puts("NO");
    }
    return 0;
}

 

posted @ 2010-08-18 13:58  菜到不得鸟  阅读(340)  评论(0)    收藏  举报