迷宫问题遇到的一些问题
就是一个10×8矩阵,入口(1,1)出口(6,8),每个点可以走八个方向,输出路径
#include<stdio.h>
#include<stdlib.h>
#define M 10
#define N 8//矩阵行列
struct way//定义存储路径的结构
{
int m,n;
}ways[20];
int p=0;//路径的标记
int find(int A[int i][int j])//查看 周围的点是否有为0的
{
//如果有 把原点封闭(改为1)并记录在一个数组中 调用自己(下一点)
if(A[i-1][j-1]!=0) {find([i-1][j-1]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i-1][j]!=0){find(A[i-1][j]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i-1][j+1]!=0){find(A[i-1][j+1]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i][j-1]!=0){find(A[i][j-1]) ;A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i][j+1]!=0){find(A[i][j+1]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i+1][j-1]!=0){find(A[i+1][j-1]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i+1][j]!=0){find(A[i+1][j]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
else if(A[i+1][j+1]!=0){find(A[i+1][j+1]);A[i][j]=1;ways[p].m=i;ways[p].n=j;p++;}
//如果没有 封闭这个点 返回上一点(从数组中查) 调用自己 (上一点)
else {A[i][j]=0;p--;find(A[ways[p].m][ways[p].n]);}
//因为一定可以走出来所以就不设置条件了
return 0;
}
int main()
{
int a[8][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,1,1,1,1,1,1,1},
{1,0,1,0,0,0,0,0,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,0,1,1,0,0,0,1},
{1,0,1,1,0,0,1,1,0,1},
{1,1,1,1,1,1,1,1,1,1}};//这个是矩阵 入口(1,1)出口(6,8)输出这个矩阵
int x=1,y=1;//定义起点
while (x!=6&&y!=8)//当起点不在终点时
{
find(a[x][y]);//调用哪个函数
}
//输出那个结构数组(输出路径)
int i;printf("走过的路径");
for(i=0;i<=p;i++)
printf("路径坐标");
system("pause");
return 0;
}
期末大作业 改不出来了TT c 回溯 递归调用 迷宫问题
[解决办法]
帮你把语法改了,但是没有看是不是正确:
#include<stdio.h>
#include<stdlib.h>
#define M 10
#define N 8//矩阵行列
struct way//定义存储路径的结构
{
int m,n;
}ways[20];
int p=0;//路径的标记
int find(int A[8][10], int i, int j)//查看 周围的点是否有为0的
{
//如果有 把原点封闭(改为1)并记录在一个数组中 调用自己(下一点)
if(A[i-1][j-1]!=0) { find(A, i-1,j-1); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i-1][j]!=0) { find(A, i-1,j); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i-1][j+1]!=0) { find(A, i-1, j+1); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i][j-1]!=0) { find(A, i, j-1); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i][j+1]!=0) { find(A, i, j+1); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i+1][j-1]!=0) { find(A,i+1,j-1); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i+1][j]!=0) { find(A,i+1,j); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
else if(A[i+1][j+1]!=0) { find(A,i+1,j+1); A[i][j]=1;ways[p].m=i;ways[p].n=j; p++;}
//如果没有 封闭这个点 返回上一点(从数组中查) 调用自己 (上一点)
else { A[i][j]=0; p--; find(A, ways[p].m,ways[p].n); }
//因为一定可以走出来所以就不设置条件了
return 0;
}
int main()
{
int a[8][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,1,1,1,1,1,1,1},
{1,0,1,0,0,0,0,0,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,0,1,1,0,0,0,1},
{1,0,1,1,0,0,1,1,0,1},
{1,1,1,1,1,1,1,1,1,1}};//这个是矩阵 入口(1,1)出口(6,8)输出这个矩阵
int x=1,y=1;//定义起点
while (x!=6&&y!=8)//当起点不在终点时
{
find(a, x, y);//调用哪个函数
}
//输出那个结构数组(输出路径)
int i;printf("走过的路径");
for(i=0;i<=p;i++)
printf("路径坐标");
system("pause");
return 0;
}
[解决办法]
试了一下,堆栈溢出了,不能这么递归下去额
[解决办法]
这章不是要学习如何使用堆栈么- -递归溢出了?