hdu-1010

简单深搜 剪枝

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

#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <string.h>
#include <queue>
#include <sstream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

using namespace std;

int n,m;
int t;

char p[10][10];
int ok ;
int sx,sy,ex,ey;

int dir[4][2]={ {0,1},{0,-1},{1,0},{-1,0}};

void dfs (int x,int y,int ans )
{
	if (ans == t)//判断时间是否用尽
	{
		if (x == ex && y == ey)
			ok = 1;
		return ;
	}
	if (ok)
		return ;

	int temp = abs(x-ex) + abs(y - ey) - abs(ans - t);//剪枝(重要)

	if ( temp > 0 || temp % 2  )
		return ;

	for(int i=0;i<4;i++)
	{
		int xx,yy;
		xx = x + dir[i][0];
		yy = y + dir[i][1];
		if (xx >=0 && xx <n && yy >=0 && yy< m && p[xx][yy] != 'X')
		{
			p[xx][yy] = 'X';
			dfs (xx,yy,ans+1);
			p[xx][yy] = '.';//回溯
		}

	}
}


int main ()
{
	while (cin>>n>>m>>t)
	{
		if (n==0 && m==0 && t==0)
			return 0;

		for (int i=0;i<10;i++)
			for(int j=0;j<10;j++)
			{
				p[i][j] = 'X';
			}


		for(int i=0;i<n;i++)
			cin>>p[i];

		int  tt = 0;
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
			{
				if ( p[i][j] == 'S' )
				{
					sx=i;
					sy=j;
				}
				if ( p[i][j] == 'D' )
				{
					ex= i;
					ey =j;
				}
				if ( p[i][j] == 'X' )		
					tt++;
			}

		if (  m*n - tt <= t )//如果时间大于最大步数 不符合条件
		{
			cout<<"NO"<<endl;
		}
		else 
		{
			ok = 0 ;
			p[sx][sy] = 'X';// 因为这里WA了好几次
			dfs (sx,sy,0);

			if (ok)
				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、付费专栏及课程。

余额充值