首页 > 代码库 > HDU 1010 深搜+减枝

HDU 1010 深搜+减枝

HDU 1010

/*************************************************************************
	> File Name: HDU1010.cpp
	> Author:yuan 
	> Mail: 
	> Created Time: 2014年11月05日 星期三 22时22分56秒
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,t,start_x,start_y,door_x,door_y;
char map[10][10];
bool ans;
bool flag[10][10];
int next[4][2]={1,0,0,1,-1,0,0,-1};
bool check(int pos_x,int pos_y)
{
    if(flag[pos_x][pos_y]==0&&pos_x>=0&&pos_x<n&&pos_y>=0&&pos_y<m&&(map[pos_x][pos_y]=='.'||map[pos_x][pos_y]=='D'))
      return 1;
    return 0;
}
void dfs(int cur_x,int cur_y,int count)
{
   // int cur_x=point/m;
    //int cur_y=point%m;
   // printf("cur_x:%d,cur_y:%d\n",cur_x,cur_y);

    if(count>t) return;
    if(ans==1) return;
    if(cur_x==door_x&&cur_y==door_y)
    {
       if(count==t) ans=1;
       // printf("count:%d\n",count);
        return;
    }
    int temp=(t-count)-abs(door_x-cur_x)-abs(door_y-cur_y);
    if(temp<0||temp&1) return;
    for(int i=0;i<4;i++){
        int pos_x=cur_x+next[i][0];
        int pos_y=cur_y+next[i][1];
        if(check(pos_x,pos_y))
        {
            flag[pos_x][pos_y]=1;
            dfs(pos_x,pos_y,count+1);
            flag[pos_x][pos_y]=0;
        }
    }
}
int main()
{   
   // printf("zhang\n");
    while(~scanf("%d%d%d",&n,&m,&t)){
       // scanf("%d%d%d",&n,&m,&t);
        if(!n&&!m&&!t) break;
        memset(map,0,sizeof(map));
        memset(flag,0,sizeof(flag));
        ans=0;
        for(int i=0;i<n;i++)
        {
          scanf(" %s",map[i]);  
        }
       // for(int i=0;i<n;i++)
       // printf("%s\n",map[i]);
        for(int i=0;i<n;i++)
           for(int j=0;j<m;j++)
        {
            if(map[i][j]=='S') start_x=i,start_y=j;
            if(map[i][j]=='D') door_x=i,door_y=j;
        }
       // printf("Start_x:%d,Start_y:%d,door_x:%d,door_y:%d\n",start_x,start_y,door_x,door_y);
        flag[start_x][start_y]=1;
       // int start_point=start_x*m+start_y;
        dfs(start_x,start_y,0);
        if(ans) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


HDU 1010 深搜+减枝