回复 9 楼 embed_xuel
人艰不拆,谢谢提醒啦,


程序代码:#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");
}
///////********填充思想,递归***************************************************///////////////
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 );}
}
}
}
程序代码:// 4*4 迷宫 深度优先搜索求解
// 4*4数组中,1代表通路,0代表障碍,2代表一条可行路径
#include <stdio.h>
char maze[4][4] = { {1, 1, 1, 1}, {0, 1, 0, 1}, {0, 1, 0, 1}, {0, 1, 1, 1} };
typedef struct {
char x, y;
} COORD;
COORD dir[4] = { {0, 1}, {0, -1}, {1, 0}, { -1, 0} };
COORD path[16];
void maze_print( void )
{
int i, j;
for ( i = 0; i < 4; i++ ) {
for ( j = 0; j < 4; j++ )
printf( "%2d", maze[i][j] );
printf( "\n" );
}
printf( "--------\n" );
}
void maze_try( int k )
{
int i;
if ( path[k].x == 3 && path[k].y == 3 ) {
maze_print();
return;
}
for ( i = 0; i < 4; i++ ) {
path[k + 1].x = path[k].x + dir[i].x;
path[k + 1].y = path[k].y + dir[i].y;
if ( path[k + 1].x >= 0 && path[k + 1].x < 4 &&
path[k + 1].y >= 0 && path[k + 1].y < 4 &&
maze[path[k + 1].x][path[k + 1].y] == 1 ) {
maze[path[k + 1].x][path[k + 1].y] = 2;
maze_try( k + 1 );
maze[path[k + 1].x][path[k + 1].y] = 1;
}
}
}
int main( void )
{
printf ( "Origin:\n" );
maze_print();
path[0].x = 0;
path[0].y = 0;
maze[0][0] = 2;
maze_try( 1 );
return 0;
}