具体看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 );}
}
}
}