hdu1010 Tempter of the Bone(DFS)

题目分析:


#include<iostream>
#include<cstdio>
using namespace std;
char maze[10][10];
int move[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
//int vis[10][10];
int n,m,t,x1,y1,x2,y2,flag;
void DFS(int x,int y,int r)//如何防止死循环
{
  //cout<<x<<"\t"<<y<<"\t"<<r<<endl;
	int x0,y0,i,temp;
    if(flag)
		return ;
	if(x==x2&&y==y2&&r==t)
	{
		flag=1;
		return ;
	}
	if(x<=0||y<=0||x>n||y>m) return;
	temp=t-r-(abs(x-x2)+abs(y-y2));
	if(temp<0||temp%2!=0) return;
	for(i=0;i<4;i++)
	{
		x0=x+move[i][0];
		y0=y+move[i][1];
		if(maze[x0][y0]!='X')
		{
			maze[x0][y0]='X';//一条路径上走过的点标掉
			DFS(x0,y0,r+1);
	    	maze[x0][y0]='.';
		}
	}

}
int main()
{
	while(scanf("%d %d %d",&n,&m,&t)!=EOF)
	{
		if(n==0&&m==0&&t==0)
			break;
		int i,j,wall=0;
		for(i=1;i<=n;i++)
		{	
			//getchar();
			for(j=1;j<=m;j++)
			{
				//scanf("%c",&maze[i][j]);//**用这个加getchar不行
                cin>>maze[i][j];
				if(maze[i][j]=='S')
				{ x1=i;y1=j; }
				if(maze[i][j]=='D')
				{ x2=i;y2=j; }
				if(maze[i][j]=='X')
					wall++;
			}	
		}
       /*for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
				printf("%c",maze[i][j]);
			cout<<endl;
		}*/
		flag=0;
		if(n*m-wall<=t)
			printf("NO\n");
		else
		{
			maze[x1][y1]='X';
            DFS(x1,y1,0);
	    	if(flag==1)
			   printf("YES\n");
		    else
			  printf("NO\n");
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值