hdoj1010(temper of the bone) 解题报告

1.首先这道题用的是深搜加剪枝。

2.深搜其实就是一个递归,原理略去,在代码上的实现是分成几步:

   第一:确定终止条件。

   第二,确定想四个方向前进的for循环。

   第三,在for循环里递归调用。

   注意,在前进时要标记已经走过的路,这里直接用的吧走过的路变成墙来做的,比较方便。

3.剪枝用了两次,一次在主函数先总得确定是不是迷宫上有那么多可以走的空格。另一次是递归是奇偶剪枝(因为从一个角到对角总是会经过两步,一个x,一个y)。

下面是代码:

#include <iostream>

using namespace std;

char maze[7][7];
int ne[4][2] = {1,0,0,-1,-1,0,0,1};

int n,m,t;
int sx,sy,dx,dy,wall;

bool dfs(int x,int y, int step)
{
	
	int temp = t-step-abs(dx-x)-abs(dy-y);
	if(temp<0||temp%2==1)
	{
		return false;
	}
	for ( int i = 0; i < 4; i++ )
	{
		int nextX = x+ne[i][0];
		int nextY = y+ne[i][1];

                if(t==step+1&&maze[nextX][nextY]=='D')
		{
					return true;
		}
		if(nextX>=0&&nextX<n&&nextY>=0&&nextY<m)
		{
			//下面这个地方不能用不等于‘X',不知道为什么。
			if(maze[nextX][nextY]=='.')
			{
				
				 maze[nextX][nextY]='X';
				
				if(!dfs(nextX,nextY,step+1))
				{
			
					maze[nextX][nextY]='.';
				}else
				return true;
			}
		}
		
	}
	
	return false;
}


int main()
{
	while(cin>>n>>m>>t&&!(n==0&&m==0&&t==0))
	{
		wall=0;
		for (int i = 0; i < n; i++)
		{
			for(int j = 0; j < m; j++ )
			{
				cin>>maze[i][j];
				if(maze[i][j]=='S')
				{
					sx = i;
					sy= j;

				}
				if(maze[i][j]=='D')
				{
					dx=i;
					dy=j;

				}
				if(maze[i][j]=='X')
				{
					wall++;
				}
			}
		}
		if(n*m-wall<=t)
		{
			cout << "NO"<<endl;
			continue;
		}

		bool flag = dfs(sx,sy,0);

		if(flag)
		{
			cout <<"YES"<<endl;
		}else{
			cout <<"NO"<<endl;
		}
		
	}
	return 0;
}

只是要注意,如果在判断的时候不用等于号,就总是超时。不知道为什么。这导致判断到没到出口只能放在for循环里而不能放到dfs函数的开头。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值