您的位置:首页 > 编程语言 > C语言/C++

C语言简单迷宫问题,深搜,通俗易懂。

2017-12-01 11:34 113 查看

简单迷宫深搜-C

[align=left]表示新人,大神勿喷,欢迎给出建议。[/align]
[align=left]在网上搜了一些深搜,发现看不懂,就把自己写的贴出来,还是比较好理解。[/align]
[align=left]自己出的小迷宫题:给出迷宫,求出共多少方法,和最小最大路程。0表示可走,1表示墙,不可走。*表示入口,#表示出口。[/align]
[align=left]以下为代码,因为需要打印出各种路线,所以“+”号表示所走的路[/align]
#include<stdio.h>
char a[50][50];
int n,m,time=0,min=1000,max=-1;//n行,m列的迷宫
int main()
{
while(scanf("%d%d%*c",&n,&m)!=EOF)
{
int i,ii,jj,j,sum=0;//ii,jj为入口地址 ,sum为多少种方法
for(i=0;i<n;i++)//给出迷宫
gets(a[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(a[i][j]=='*'){ii=i;jj=j;break;}	//找出入口ii,jj
void sumserch (int ii,int jj,int *sum);//函数申明
sumserch(ii,jj,&sum);
printf("迷宫共有%d种解法,最短距离为%d,最长距离为%d\n",sum,min,max);
}
}
void sumserch(int ii,int jj,int *sum)
{
time++;   // 经过路程
if(a[ii][jj]=='+'||a[ii][jj]=='1'||ii>=n||ii<0||jj<0||jj>=m) //当不可走时,就退后,路程减一
{time--;return;}
if(a[ii][jj]=='#') //找到出口
{
(*sum)++;   //不知为啥,*sum++就不对,不明所以。
int i,j;
for(i=0;i<n;i++)  //这一段仅为打印出每种路线,可不要
{
for(j=0;j<m;j++)   printf("%c ",a[i][j]);
printf("\n");
}
printf("time=%d\n\n",time);
if(time>max)max=time;  //是否路程最大
if(time<min) min=time; //是否路程最小
time--;    //回退一步,找其他路线
return;
}
a[ii][jj]='+';   //把当前所处位置变为不可走,已经走过
sumserch(ii+1,jj,sum);  //向上
sumserch(ii-1,jj,sum);  //向下
sumserch(ii,jj+1,sum);  //向右
sumserch(ii,jj-1,sum);  //向左
a[ii][jj]='0';    //当前位置所有方向都搜索过了,重新变为可走。
time--;
4000
//回退一步
}
转载请注明出处,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迷宫 深搜