您的位置:首页 > 其它

HDU 1010 【搜索+奇偶剪枝】

2015-09-11 19:57 471 查看
0 0,,之前纠结了很久的一道题,今天上网翻了一下答案,发现是用搜索做的,然后发现现在对于搜索已经没有想法了。。。TAT,当初最好的难道不是搜索吗!!我以为我搜索好歹是入门了,但是居然不知道奇偶剪枝。。QAQ

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int n,m,t;
int flag,ji;
int sx,sy,ex,ey;
char a[10][10];
int vis[10][10];
int cmpx[4]={0,0,1,-1};
int cmpy[4]={1,-1,0,0};
bool check(int x,int y,int rem)
{
    if(x<0||x>=n||y<0||y>=m) return false;
    if(a[x][y]=='X'||vis[x][y]) return false;
    int d=abs(x-ex)+abs(y-ey);
    if((d&1)!=(rem&1)) return false;
    return true;
}
void search(int x,int y,int d)
{
    //printf("tx=%d ty=%d\n",x,y);
    if(flag||d>t) return;
    if(a[x][y]=='D')
    {
        if(d==t) flag=1;
        return;
    }
    vis[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int tx=x+cmpx[i],ty=y+cmpy[i];
        
        if(!check(tx,ty,t-d-1)) continue;
        search(tx,ty,d+1);
    }
    vis[x][y]=0;
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        if(!n&&!m&&!t) break;
        int tmp=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s",a[i]);
            for(int j=0;j<m;j++)
            {
                if(a[i][j]=='S') sx=i,sy=j;
                else if(a[i][j]=='D') ex=i,ey=j;
                if(a[i][j]=='X') tmp++;
                vis[i][j]=0;
            }
        }
        int d=abs(sx-ex)+abs(sy-ey);
        if((d&1)!=(t&1)||n*m-tmp<=t) {printf("NO\n");continue;}
        flag=0;
        ji=(d&1);
        search(sx,sy,0);
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: