杭电1010-搜索&&迷宫问题

16 篇文章 0 订阅
9 篇文章 0 订阅

迷宫问题,注意剪枝!!!

AC代码:

#include<stdio.h>
#include<math.h>
int n,m,t,flag;
int startx,starty,endx,endy,starttime,wallnum;
int movex[]={0,-1,0,1},movey[]={-1,0,1,0};//
char maze[10][10];
int abs(int a,int b)
{
	int c;
	c=a-b;
	if(c>0)
	   return c;
	else
	   return b-a;
}
int dfs(int sx,int sy,int st)
{
	int i,time;
	if(sx==endx&&sy==endy&&st==t)
	{//到达终点 
		flag=1;
		return 1;
	}
	time=t-st-abs(sx,endx)-abs(sy,endy);
	if(time<0||time%2!=0)//剪枝 
	  return 0;
	for(i=0;i<4;i++)
	{
		if(sx+movex[i]<0||sx+movex[i]>m-1||sy+movey[i]<0||sy+movey[i]>n-1)
		  continue;
		  if(maze[sx+movex[i]][sy+movey[i]]!='X')
		  {
		  	maze[sx+movex[i]][sy+movey[i]]='X';
		  	dfs(sx+movex[i],sy+movey[i],st+1);
		  	maze[sx+movex[i]][sy+movey[i]]='.';
		  }
		  if(flag) break;
	} 
}
int main()
{
	while(scanf("%d%d%d",&m,&n,&t)!=EOF&&!(m==0&&n==0&&t==0))
	{
		int i,j;
		getchar();//
		flag=0;//标志量 ,为1时说明找到出口 
		wallnum=0;//墙的数量起始为0 
		for(i=0;i<m;i++)
		 {
		  for(j=0;j<n;j++)
		  {
		  	scanf("%c",&maze[i][j]);
		  	if(maze[i][j]=='S')
		  	{
		  		startx=i;
		  		starty=j;
		  		maze[startx][starty]='X';//标记起始位置,走过的不能再走了 
		  	}
		  	else if(maze[i][j]=='D')
		  	{
		  		endx=i;
				endy=j;
		  	}
		  	else if(maze[i][j]=='X')
			  wallnum++; 
		  }
		  getchar();//接受换行符 
	     }
    if(n*m-wallnum>=t)
	{
		dfs(startx,starty,0);
	} 
	if(flag)  
	   printf("YES\n");
	else
	   printf("NO\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值