HDU1010 --- Tempter of the Bone(剪枝)

Tempter of the Bone

小明做了一个很久很久的梦,醒来后他竟发现自己和朋友在一个摇摇欲坠的大棋盘上,他们必须得想尽一切办法逃离这里。
经过长时间的打探,小明发现,自己所在的棋盘格子上有个机关,上面写着“你只有一次机会,出发后t秒大门会为你敞开”,而他自己所在的棋盘是大小为 N*M 的长方形,他可以向上下左右四个方向移动(不可走有障碍点)。棋盘中有一扇门。根据机关的提示,小明顿时明白了,他和朋友必须在第 t 秒到门口。而这一切,没有回头路!因为一旦他移动了,他刚才所在的点就会消失,并且他不能在一个点上停留超过一秒,不然格子会爆炸。大逃亡开始了,请问小明和朋友能安全的逃出这奇怪的棋盘吗?

Input
输入多组测试数据。每个测试用例的第一行包含三个整数 N、M 和 T ( 1 < N , M < 7 ; 0 < T < 50 ),分别表示棋盘的大小和门打开的时间。接下来的N行给出棋盘布局,每一行包含M个字符。其中
“.”: 无障碍点
“X”: 障碍点
“S”: 起点
“D”: 门

输入以 3 个 0 结束。这个测试用例不需要处理。
输入数据中的空格有些问题,请不要使用getchar(),如果一定要用可以选择scanf("%s",) 自动忽略空格

Output
对于每组样例输出一行。
如果小明能够安全逃出,输出 “YES” ,否则输出 “NO”。

Sample Input
4 4 5
S.X.
…X.
…XD

3 4 5
S.X.
…X.
…D
0 0 0
Sample Output
NO
YES

奇偶剪枝

Code:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=105;
char tu[N][N];
bool vis[N][N];
int d[4][2]={0,1,1,0,0,-1,-1,0};
int n,m,s;
int ex,ey;
int nx,ny;
int ans;
void dfs(int x,int y,int time)
{
	if(ans)return ;
	if(time>s)return ;
	if(time==s&&x==nx&&y==ny){
		ans=1;
	}
	int q=s-time-abs(nx-x)-abs(ny-y);
	if(q&1)return ;
	for(int i=0;i<4;i++){
		int dx=x+d[i][0];
		int dy=y+d[i][1];
		if(dx>=0&&dy>=0&&dx<n&&dy<m&&vis[dx][dy]==0&&tu[dx][dy]!='X'){
			tu[dx][dy]='X';
			dfs(dx,dy,time+1);
			tu[dx][dy]='.';
		}
	}
}
int main()
{
	while(~scanf("%d%d%d",&n,&m,&s)&&(n+m+s))
	{
		int q=0;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			cin>>tu[i][j];
			if(tu[i][j]=='S')ex=i,ey=j;
			if(tu[i][j]=='D')nx=i,ny=j;
			if(tu[i][j]=='X')q++;
		}
		if(n*m-q-1<s){
			cout<<"NO"<<endl;
			continue;
		}
			ans=0;
			tu[ex][ey]='X';
			dfs(ex,ey,0);
			if(ans)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、付费专栏及课程。

余额充值