HDU 1010 Tempter of the Bone

12 篇文章 0 订阅


这是个典型的剪枝搜索问题。。。
要注意输入字符的时候,一定要使用getchar(),或scanf(" %c",&c[i][j])

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int m,n,t;
int dx,dy;  //  记录起始位置
int Dx,Dy;  //  记录门的位置
char c[10][10];
int flag;
void DFS(int x,int y,int s)
{
 if(s==t&&x==Dx&&y==Dy){flag=1;  return ;} //找到出口,结束搜索
 if((abs(Dx-x)+abs(Dy-y))%2 != (t-s)%2) return ;  //时间和门所在点的奇偶性不同不可能到达,剪枝掉
    if(x>0&&c[x-1][y]!='X'&&s<t)  {c[x][y]='X';DFS(x-1,y,s+1);c[x][y]='.';} // 向左
 if(flag) return ;     
 if(y>0&&c[x][y-1]!='X'&&s<t)  {c[x][y]='X';DFS(x,y-1,s+1);c[x][y]='.';} // 向上
 if(flag) return ;   
 if(x<n-1&&c[x+1][y]!='X'&&s<t){c[x][y]='X';DFS(x+1,y,s+1);c[x][y]='.';} // 向右
 if(flag) return ;    
 if(y<m-1&&c[x][y+1]!='X'&&s<t){c[x][y]='X';DFS(x,y+1,s+1);c[x][y]='.';} // 向下
 return ; 
}
int main()
{
 int i,j,num;
 while(scanf("%d%d%d",&n,&m,&t)!=EOF)
 {
  if(n==0&&m==0&&t==0) return 0;
  num=0;
  getchar();
  for(i=0;i<n;i++){
   for(j=0;j<m;j++){
       scanf("%c",&c[i][j]);
    if(c[i][j]=='S'){  // 记录起点
     dx=i; dy=j;
    }
    else if(c[i][j]=='D'){  // 记录终点
     Dx=i; Dy=j;
     num++;
    }
    else num++;
   }
   getchar();
  }
  if(num<t){   //可行点少于规定时间 不可能到达 剪枝掉
   printf("NO\n");
   continue;
  }
  flag=0;
  c[dx][dy]='X'; 
  DFS(dx,dy,0);    // 从起始点开始遍历搜索
  if(flag)  printf("YES\n");
  else  printf("NO\n");
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值