Tempter of the Bone

hdu 1010

題意 主角在規定時間內從起點到達終點,必須是是在規定的那一時刻(被坑le,

本意 想dfs暴搜一下,T的很慘,最後大佬告訴我要剪枝。明天8月1日建軍節,故寫此篇。

#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
int n,m,vis[10][10],cun[4][2]={{0,1},{0,-1},{1,0},{-1,0}},x2,y2,k,flag;
char map[10][10];
void dfs(int x,int y,int step)
{	if((abs(x-x2)+abs(y-y2))%2!=(k-step)%2)
		return;
	if(x==x2&&y==y2)
	{	
		if(step==k)
		{	
			flag=1;
			return ;
		}
		else
		return ;
	} 
	for(int i=0;i<4;i++)
	{	
		int xx=x+cun[i][0];
		int yy=y+cun[i][1];
		if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||map[xx][yy]=='X')
			continue;	
		vis[xx][yy]=1;
		dfs(xx,yy,step+1);
		vis[xx][yy]=0;
	}
	return ;
}
int main(){
	 while(cin>>n>>m>>k)
	 {	if(n==0&&m==0&&k==0)
	 		break;
		int x1,y1;
		flag=0;
		memset(vis,0,sizeof(vis));
	 	for(int i=1;i<=n;i++)
	 		for(int j=1;j<=m;j++)
	 		{
	 			cin>>map[i][j];
	 			if(map[i][j]=='S')
	 			{	vis[i][j]=1;
	 				x1=i;
	 				y1=j;
				}	
				if(map[i][j]=='D')
				{
					x2=i;
					y2=j;
				}
			}
			dfs(x1,y1,0);
	 	if(flag)		
	 	cout<<"YES"<<endl;
	 	else
	 	cout<<"NO"<<endl;
	 }
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章