码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1010 Tempter of the Bone ->简单搜索

时间:2015-05-05 21:53:39      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   搜索   

分析:搜索题,注意剪枝。

#include<iostream>
using namespace std;

int dfs(int si,int sj,int ei,int ej,int mt);
char map[8][8];
int m,n,fa;

int main()
{
	int t,i,j,wall,sti,stj,eni,enj;
	while(cin>>n>>m>>t &&(n||m||t))
	{
		wall=0;
		fa=0;
		for(i=1;i<=n;i++)
		{
			getchar();
			for(j=1;j<=m;++j)
			{
				cin>>map[i][j];
				if(map[i][j]=='X')
				{
					wall++;
				}
				else if(map[i][j]=='S')
				{
					sti=i;
					stj=j;
				}
				else if(map[i][j]=='D')
				{
					eni=i;
					enj=j;
				}
			}
		}
		if(wall>=n*m-t)
		{
			cout<<"NO"<<endl;
			continue;
		}
		map[sti][stj]='X';
		dfs(sti,stj,eni,enj,t);
		if(fa)
		{
			cout<<"YES"<<endl;
		}
		else
		{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

int dfs(int si,int sj,int ei,int ej,int mt)
{
	int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
	int temp,i;
	if(mt<0) return 0;
	if(si<1||sj<1||si>n||sj>m) return 0;
	temp=mt-(ei-si)-(ej-sj);
	if(temp<0 || temp&1) return 0;
	if(map[si][sj]==map[ei][ej] && mt==0) 
	{
		fa=1;
		return 1;
	}
	for(i=0;i<4;i++)
	{
		if(map[si+dir[i][0]][sj+dir[i][1]]!='X')
		{
			map[si+dir[i][0]][sj+dir[i][1]]='X';
			if(!dfs(si+dir[i][0],sj+dir[i][1],ei,ej,mt-1))
			{
				map[si+dir[i][0]][sj+dir[i][1]]='.';
			}
			else
			{
				return 1;
			}
		}
	}
	return 0;
}


HDU ACM 1010 Tempter of the Bone ->简单搜索

标签:c   c++   acm   算法   搜索   

原文地址:http://blog.csdn.net/a809146548/article/details/45507513

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!