给定一个二维数组,2为墙,0为路。找出所有路径并打印出来。
方法一:
用递归,打印出直观的图形来显示路径。
PS:要将走过的路径做一个标记,换成一个和墙与路不一样的值,当走到死路的时候要在回去时将道路改回原来的0.这样,我们就可以用上下左右四个方向进行递归,每到一次终点就打印一次,一共有几条路径,就打印几个二维数组出来。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void visited(int (*pa)[9], int i, int j)
{
int n, m;
pa[i][j] = 1;
if(i == 7 && j == 7){
printf("find path: \n");
for(n=0; n<9; n++){
for(m=0; m<9; m++){
if(pa[n][m] == 1)
printf("* ");
else if(pa[n][m] == 2)
printf("2 ");
else
printf("0 ");
}
printf("\n");
}
}
if(pa[i-1][j] == 0)
visited(pa, i-1, j);
if(pa[i+1][j] == 0)
visited(pa, i+1, j);
if(pa[i][j-1] == 0)
visited(pa, i, j-1);
if(pa[i][j+1] == 0)
visited(pa, i, j+1);
pa[i][j] = 0;
}
int main()
{
int a[9][9] = {2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 0, 0, 0, 0, 0, 0, 0, 2,
2, 2, 2, 0, 2, 2, 2, 0, 2,
2, 2, 2, 0, 2, 2, 2, 0, 2,
2, 2, 2, 0, 2, 2, 2, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 2, 2, 2, 2, 2, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2,
};
visited(a, 1, 1);
return 0;
}
方法二:
用迭代求解。输出可以变为路径的坐标(可以定义一个结构体数组来存放路径坐标)。思路差不多。
#include<stdio.h>
#include<conio.h>
int migong[10][10]=
{
{2,2,2,2,2,2,2,2,2,2},
{2,0,0,0,0,0,0,2,2,2},
{2,0,2,2,2,2,2,0,0,2},
{2,0,2,0,0,0,0,0,0,2},
{2,0,0,0,2,0,2,2,2,2},
{2,2,2,2,0,0,2,2,2,2},
{2,0,0,0,0,2,2,2,2,2},
{2,0,2,2,0,0,2,2,2,2},
{2,0,0,0,0,0,0,0,0,2},
{2,2,2,2,2,2,2,2,2,2}
};
int num;
struct
{
int x,y,d;
}lj[100];//x,y分别为垂直和水平方向
void start()
{
int top=0,x,y,d,find;//d为设置方向,上下左右。find为设置找不找得到路
lj[top].x=1;
lj[top].y=1;
migong[1][1]=-1;
find=0;d=-1;
while(top>-1){
if(lj[top].x==8&&lj[top].y==8)
{
printf("迷宫路径如下:\n");
printf("start->");
for(x=0;x<=top;x++)
{
printf("(%d,%d)-> ",lj[x].x,lj[x].y);//把找到的路径输出
num++;
if(num%8==0)
printf("\n");
}
printf("->end!\n");
}
while(d<4&&find==0){
d++;
switch(d){
case 0:x=lj[top].x-1; y=lj[top].y; break;//方向为上
case 1:x=lj[top].x; y=lj[top].y+1;break;//方向为右
case 2:x=lj[top].x+1; y=lj[top].y; break;//方向为下
case 3:x=lj[top].x; y=lj[top].y-1;}//方向为左
if(migong[x][y]==0)
find=1;
}
if(find==1){ //判断是否找得到
lj[top].d=d;
top++;
lj[top].x=x;
lj[top].y=y;
d=-1;find=0; //重新调整方向
migong[x][y]=-1;}
else{
migong[lj[top].x][lj[top].y]=0;
top--;d=lj[top].d; //找不到的话退栈
}
}
}
void main()
{
start();
getch();
}