迷宫
使用一个二维数组模拟迷宫,在这里使用栈结构和回溯的算法简单实现迷宫。
给定一个入口,先将入口坐标入栈。再对四个方向进行判断,是否能走,如果能走将下一个节点入栈。当无路可走时,出栈节点,回溯到上一个节点进行上一步判断。当找到一个出口时
再回溯到上一个岔路口,寻找另外通路。
如果将所有节点出栈,则说明迷宫无出口。
//假设该迷宫为带环并且有多个出口一个入口
//假设1为迷宫的通路,0不可以走
int m[N][N] = {
0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 1, 0,
1, 1, 1, 0, 1, 0,
0, 0, 1, 0, 1, 0,
1, 1, 1, 1, 1, 1,
0, 0, 1, 0, 0, 0 }
寻找迷宫的出口
int MazeGetPath2(pos entry) //闯入入口的节点坐标,entry为坐标的结构体
{
Stack p;
Stack* path;
int t1=0;
pos cur;
pos next;
path = &p;
path->top = -1;
path->r[++path->top] = entry; //将出发点入栈
while (path->top != -1) //若栈为空则证明无出口
{
cur = path->r[path->top];//取栈定数据
m[cur.row][cur.col] = 2; //若是走过的数组便将值置为2
if ((cur.col == 0 || cur.col == 5 || cur.row == 0 || cur.row == 5)&&(cur.col!=entry.col&&cur.row!=entry.row)) //出口位于数组边界且不等于入口
{
t1++;
printf("出口%d:%d %d\n",t1, cur.row, cur.col);
path->top--; //从出口回溯到岔路口,不断回溯将所有的路都走遍
continue;
}
//探测下一个位置,上下左右
next = cur;
next.row += 1;
if (MazeChecklsAccess(&next))
{
path->r[++path->top] = next;
continue;
}
next = cur;
next.row -= 1;
if (MazeChecklsAccess(&next))
{
path->r[++path->top] = next;
continue;
}
next = cur;
next.col -= 1;
if (MazeChecklsAccess(&next))
{
path->r[++path->top] = next;
continue;
}
next = cur;
next.col += 1;
if (MazeChecklsAccess(&next))
{
path->r[++path->top] = next;
continue;
}
path->top--; //如果走不通回溯到上一个节点
} //回溯到上一个节点
if (t1 == 0) //t1为出口个数计数器没有一条出口
{
printf("无出口\n");
return 0;
}
else
return 1; //若有出口返回1
}
`
结果