题目是这样的:
#include
#include
char map[5][3]; //一般用二维数组处理迷宫的样子
int d[4][2] = {{-1,0},{0,-1},{1,0},{0,1}}; //这个二维数组用于处理,左、上、右、下。左上角坐标是(0, 0)
int sum=0;
int sx,sy,tx,ty; //有s的是指起点,有t的是指终点
void dfs(int x,int y);
int main()
{
int i,j,x,y;
//读入迷宫
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='@') //找起点(不用另起,只需要在读入迷宫的时候,顺带找)
sx=i,sy=j;
if(map[i][j]=='*')//找终点
tx=i,ty=j;
getchar(); //用来清楚缓存
}
}
dfs(sx,sy) ;
printf("总共有%d走法",sum);
}
void dfs(int x,int y)
{
int nx,ny,i,cnt=0; //nx表示新的x,ny表示新的y。
// int p_x[10],p_y[10]; //处理路径问题 ,路径我都记录下来,打不打印是我的事
for(i=0;i<4;i++) //用循环和数组实现左上右下
{
nx=x+d[i][0];
ny=y+d[i][1];
if(map[nx][ny]=='*') //写递归时可以先想想递归出口是什么
{
sum++;
continue; //和break不一样 ,走下一个方向 ,是最近的那个点再一次左上右下
}
else if(nx>4 || nx<0 || ny <0 || ny>2) //不在地图内
continue;
else if(map[nx][ny]=='.')
{
map[nx][ny] = '#'; //保存现场。这个点在这次更深的dfs中不能再用,把其当作墙来看
//j++;
dfs(nx,ny);
map[nx][ny] = '.'; //恢复现场。回溯之后,这个点可以再次用
// j--;
}
}
}
代码运行结果如下:
你把所有的走法都输出一下,看看是不是和例子的不同,多了什么
不知道你这个问题是否已经解决, 如果还没有解决的话:为了方便大家,我这打出来一个直接复制粘贴就可以运行的代码👨🦳
/* filename: 数据结构实验_迷宫.c
* brife: Sovle the maze problem by using dfs&bfs
* author: HP1020--SNOOHAIRY
* date: 2019.10.18 -- Firday
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 20
/* *建立一个二维数组存迷宫
*要是八个方向能有位置则压入栈,要是下一步没有则弹出栈回溯
*直到找到终点为止
*/
int direction[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; //定义一个数组存八个方向操作数
int maze[MAXN][MAXN];
int flag=0;
//栈中存位置以及遍历时所走的方向,打印时可以显示出来
typedef struct Node{
int x;
int y;
// int dir; //-1为左上右下对应 '\' 0为上下对应'|' 1为左右对应'——' 2为左下右上对应'/'
struct Node *next;
}Node;
typedef Node* Stack; //定义数据结构栈 Stack
//-----------创建一个空栈--------------
Stack creakEmptyStack(){
Stack p;
p=(Stack)malloc(sizeof(Node)); //申请一个空间
if(p){
p->next=NULL;
return p;
}
else{
printf("No space!\n"); //申请空间失败则提示并返回空
return NULL;
}
}
//------------将元素压入栈----------------
void push(int x,int y,Stack s){
Stack p;
p=(Stack)malloc(sizeof(Node));
if(p){ //如果申请空间成功则用头插法将元素压入
p->x=x;
p->y=y;
if(!s->next) p->next=NULL; //如果此时栈里还没有任何元素,则p此时为第一个结点
else p->next=s->next; //否则将p插入头结点之后
s->next=p;
}
else{
printf("No space!\n");
}
}
//-------------检测栈是否为空--------------
int isEmpty(Stack s){ //为空则返回1,不为空返回0
if(s->next==NULL) return 1;
else return 0;
}
//--------------将元素弹出栈----------------
void pop(Stack s){
Stack p;
p=s->next;
if(p->next){
s->next=p->next;
free(p);
}
else return;
}
//------------取栈顶元素------------------
Node top(Stack s){
Node t;
//判断是否为空,若不为空则返回
t=*(s->next);
return t;
}
void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s);
void printPath(Stack s,int n,int m);
int main()
{
int n,m,i,j,xa,xb,ya,yb,ox;
//--------------建立迷宫--------------
printf("请输入迷宫大小:(长、宽)\n");
scanf("%d%d",&n,&m);
if(n<=20&&m<=20){
printf("请选择构建迷宫的方式:\n0.随机生成迷宫\n1.手动输入迷宫\n"); //实际上不是0就可以手动输入
scanf("%d",&ox);
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(!ox)maze[i][j]=rand()%2; //这里为伪随机数
else scanf("%d",&maze[i][j]);
}
}
printf("\n");
//----------输出构建迷宫-------------
printf("生成的迷宫如下:\n");
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%d ",maze[i][j]);
}
printf("\n");
}
printf("请输入起点及终点:\n");
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
//标记起点
maze[xa-1][ya-1]=2;
//创建一个空栈
Stack s=creakEmptyStack();
//创建一个空队列
//QueueLink q=creakEmptyQueue();
mazePath(xa-1,ya-1,xb-1,yb-1,n,m,s);
if(!flag) printf("没有成功找到路径\n");
}
else printf("输入数据超出迷宫范围\n");
}
//-----------遍历迷宫寻找路径(dfs)------------
void mazePath(int x,int y,int endx,int endy,int n,int m,Stack s){
int newx,newy,i;
Node t;
for(i=0;i<8;i++){
newx=x+direction[i][0];
newy=y+direction[i][1];
if(newx>=0&&newx<n&&newy>=0&&newy<m&&maze[newx][newy]==0){ //走到出口
push(newx,newy,s);
maze[newx][newy]=2;
if(newx==endx&&newy==endy){
flag++;
printPath(s,n,m);
maze[newx][newy]=0;
pop(s);
}
else{
mazePath(newx,newy,endx,endy,n,m,s);
}
}
// else if(!isEmpty(s)) pop(s);
}
maze[x][y]=0; //遍历完八个方向之后回溯前将自己赋为空
pop(s);
}
//-------------打印迷宫路径-----------------
void printPath(Stack s,int n,int m){
int cont =0; //计算路径长度
s=s->next;
int i=0,j=0;
printf("第%d条路径为:\n",flag);
for(i=0;i<n;i++){ //按图形输出
for(j=0;j<m;j++){
if(maze[i][j]==2) printf("* ");
else printf("%d ",maze[i][j]);
}
printf("\n");
}
while(s->next){ //将栈中的元素输出为直观路径
printf("(%d,%d)->",s->x+1,s->y+1);
s=s->next;
cont++;
}
printf("(%d,%d)",s->x+1,s->y+1);
cont++;
printf("\n");
printf("路径长度为:%d\n\n",cont);
}
📢 转载请注明出处🎈 码字不易,能跑出想要的效果的话点个赞叭