笨笨熊搬家问题 填充思想--怎么输出结果--递归--每日一练(六)

具体看C论坛我发的帖子去。

提高的:1、刚开始不知道怎么着手

                2、知道填充思想后对如何输出结果存在疑惑,不会用return,以后不用了,容易犯错,用指针返回调用函数的结果以后养成自己的编程习惯;

                3、递归的使用肯定伴随这一个参数的变化,刚开始我没有加上B1,B2的加一或者减一,得不出结果,下次注意了。

 

 

*********寻找可用路径,知道的有填充或者回溯,********************/
#include <stdio.h> 
#include <stdlib.h>
void find(char*p,int B_pos1,int B_pos2,int c,int r,int *q);
void main()
{
   int r,c;int i,j;int B_pos1,B_pos2,H_pos1,H_pos2=0;
   char *p;int num=0;
   printf("请输入地图的行数和列数,空格隔开:\t");
   scanf("%d%d",&r,&c);getchar();  //----此getchar();  是为了消除前面scanf("%d%d",&r,&c);输入时留下的换行符!
   printf("请输入%d行%d列的地图:\n",r,c);

   p=(char *)malloc(sizeof(char)*r*c);    
   for(i=0;i<r;i++)//输入地图 
     {
       for(j=0;j<c;j++)
           {
               scanf("%c",(p+c*i+j));               
           }
      } 
   for(i=0;i<r;i++)//显示地图
	{
		for(j=0;j<c;j++)
		{
			printf("%c\t",*(p+c*i+j));
		 }
		 printf("\n");
    }   
   for(i=0;i<r;i++)//找到地图的起点
	{
		for(j=0;j<c;j++)
		{
			if(*(p+c*i+j)=='B');
			{ B_pos1=i;
			  B_pos2=j;
			}
		 }
    }
   find(p,B_pos1,B_pos2,c,r,&num);//用了递归
   if(num=1)    //如果一只都没有Y输出即找到H的话就输出N找不着
        {printf("Y");}  
   else  printf("N");
}
///********填充思想,递归***************************************************///
/*******find函数寻找可用路径,如果四个方向有‘-’,即将‘B’填充到这个单元格****///
void find(char*p,int B1,int B2,int c,int r,int *q)
{   //int num=0;num=*q用来记录是否有可以找到的路径,一旦找到一条路,*q=1,num=*q,main函数用过num的值打印“Y”
	if(B2!=0)       //下面是分四个方向进行分解,并对边界问题进行约束
	  {
		 if(*(p+c*B1+B2-1)=='H')
	         {*q=1;}//等于1表示可以找到路径,在main函数中打印出来
		 else{ 
			   if(*(p+c*B1+B2-1)=='-')
				{*(p+c*B1+B2-1)='B';B2=B2-1;find(p,B1,B2,c,r,q );}//注意要减一再递归,以下同
			  }			
		}
	if(B2!=r-1)
	    {
		   if(*(p+c*B1+B2+1)=='H')
	         {*q=1;}
		   else{ 
			   if(*(p+c*B1+B2+1)=='-')
				{*(p+c*B1+B2+1)='B';B2=B2+1;find(p,B1,B2,c,r,q);}
				}	
		}
    if(B1!=0)
	    {
		   if(*(p+c*(B1-1)+B2)=='H')
	         {*q=1;}
		   else{ 
			   if(*(p+c*(B1-1)+B2)=='-')
				{*(p+c*(B1-1)+B2)='B';B1=B1-1;find(p,B1,B2,c,r,q );}
						}	
		}
	 if(B1!=c-1)
	    {
		   if(*(p+c*(B1+1)+B2)=='H')
	         {*q=1;}
		   else{ 
			   if(*(p+c*(B1+1)+B2)=='-')
				{*(p+c*(B1+1)+B2)='B';B1=B1+1;find(p,B1,B2,c,r,q );}
						}	
		}
 }




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值