Tempter of the Bone hdu1010 简单深搜剪枝

http://acm.hdu.edu.cn/showproblem.php?pid=1010

最近自己的状态好像很糟很糟...

不知道在想些什么。也不知道在做些什么...

总之 糟透了///...

#include <iostream>
#include <cmath>
using namespace std;

char map[10][10];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool flag;
int n,m,t;
int ex,ey;

void DFS(int sx,int sy,int t){

	if (t<0||flag)
		return ;

	//剪枝1 时间到了以后在D上则设置flag=1退出,否则直接退出
	if (t==0){
		if (sx==ex&&sy==ey)
			flag=true;
		return ;
	}

	//剪枝2 奇偶性剪枝
	//起点和终点确定以后就可以确定走的步数是奇数还是偶数,通过这个特点来剪枝
	int temp;
	temp=abs(sx-ex)+abs(sy-ey)-t;
	if (temp>0||temp&1)
		return;

	int i,nx,ny;
	for (i=0;i<4;i++){
		nx=sx+dir[i][0];
		ny=sy+dir[i][1];
	
		if (nx>=0&&nx<n&&ny<m&&ny>=0&&map[nx][ny]!='X'){
			map[nx][ny]='X';  //这里设置的是next
			DFS(nx,ny,t-1);
			map[nx][ny]='.';  //回溯
		}
	}
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif
	int i,j,sx,sy,wall;
	char c;
	while (scanf("%d%d%d",&n,&m,&t)!=EOF){
		if (n==0&&m==0&&t==0)
			break;

		wall=0;
		for (i=0;i<n;i++){
			scanf("%s",map[i]);
			for (j=0;j<m;j++){
				c=map[i][j];
				if (c=='S'){
					sx=i;
					sy=j;
				}
				else if (c=='D'){
					ex=i;
					ey=j;
				}
				else if (c=='X')
					wall++;
			}
		}

		//剪枝3 能走的格子应该比时间多1
		if (m*n-wall<=t)
			printf("NO\n");
		else {
			flag=false;
			map[sx][sy]='X';
			DFS(sx,sy,t);
			if (flag)
				printf("YES\n");
			else printf("NO\n");
		}

	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值