hdu 1010 Tempter of the Bone

简单的dfs..还要加上剪枝来处理,

1>当当前的位置即为终点的‘D’的时候并且所走时间大于理论时间,即为不可到达;

2>添加入奇偶剪枝来处理,(ps:奇偶剪枝:即将map[i][j]看成如下图所示

1 0 1 0 1 0        如map[0][0]要走到map[0][2]需要走两步,map[0][1]要走到map[1][0]要走2步,而map[0][0]要走到

0 1 0 1 0 1        map[0][1]需要走1步,也就是说,1->1走偶数步,0->0走偶数步,1->0或者0->1走奇数步;              

1 0 1 0 1 0        因此,如果要求从1->1或者0->0,但时间要求是奇数,则不可到达;从1->0或者从0->1要求时间

0 1 0 1 0 1        为偶数,则不可到达;);

3>搜索到结果,则终止搜索;

4>走到当前位置的时间大于理论规定时间则不可到达;

5>迷宫中所有'X'小于时间t的,则不可到达;

(小贴士:好吧,居然犯傻在递归中的t+1写成t++,这么低级的错误。。。。。。。)


#include<iostream>
#include<string>
using namespace std;
char map[7][7];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//四个可行方向
int m,n,prex,prey,lastx,lasty,time,out;
void DFS(int x,int y,int t)
{
	int X,Y,i;
	if(out)
		return ;
	if(x==lastx&&y==lasty&&t==time)//当前的位置为终点的门且时间相等则完成
	{
		out=1;
		return ;
	}
	if((time-t)%2!=(x+y+lastx+lasty)%2)//奇偶剪枝,步数与当前位置与终点的距离奇偶性不同则返回
		return ;
	for(i=0;i<4;i++)
	{
		X=x+dir[i][0];
		Y=y+dir[i][1];
		if(X>=0&&X<n&&Y>=0&&Y<m&&map[X][Y]!='X')
		{
			map[X][Y]='X';
			DFS(X,Y,t+1);//就是这里的t+1,不能写成t++哦~!!
			map[X][Y]='.';//要将该点标记回未访问过,回朔过程;
		}
	}
}
int main()
{
	int i,j;
	while(cin>>n>>m>>time)
	{
		if(n==0&&m==0&&time==0)
			break;
		else
		{
			out=0;
			memset(map,0,sizeof(map));
			for(i=0;i<n;i++)
				for(j=0;j<m;j++)
				{
					cin>>map[i][j];
					if(map[i][j]=='S')
					{
						prex=i;
						prey=j;
						map[i][j]='X';
					}
					if(map[i][j]=='D')
					{
						lastx=i;
						lasty=j;
					}
				}
				DFS(prex,prey,0);
				if(out)
					cout<<"YES"<<endl;
				else
					cout<<"NO"<<endl;
		}
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值