用回溯法递归实现迷宫
来源:互联网 发布:霍尼韦尔监控软件下载 编辑:程序博客网 时间:2024/06/05 07:46
#include <stdio.h>
#define N 19//整个迷宫大小(包括最外层墙壁)
char Maze[N][N] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
char step[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; //定义四个方向
int count = 0;
char Check(char i, char j) //判断下一步是不是通路
{
if (i >= 0 && i <= 18 && j >= 0 && j <= 18)
{
if (0 == Maze[i][j])
{
return 1;
}
}
return 0;
}
void Display(void)
{
char i, j;
for (i = 0; i<N; ++i)
{
for (j = 0; j<N; ++j)
{
printf("%d", Maze[i][j]);
}
printf("\n");
}
}
void Find(char ci, char cj)
{
char n;
if ((N - 1) == cj) //这个边界设置得比较粗糙,到N-1这个下标就算终点,没想到什么好的办法
{
Maze[ci][cj] = 6; //终点的最后一个6
printf("解法%d(Enter回车查看下一解法):\n", ++count);
Display();
getchar();
Maze[ci][cj] = 0;
}
else
{
for (n = 0; n<4; ++n)
{
if (Check(ci + step[n][0], cj + step[n][1])) //依然用Check实现判断:是否可以在某个方向走下一步
{
Maze[ci][cj] = 6; //6表示走过的路
Find(ci + step[n][0], cj + step[n][1]);
Maze[ci][cj] = 0; //传统回溯方法
}
}
}
}
int main(void)
{
printf("\t迷宫问题(1 墙壁 0 道路 6 解法)\n\n");
printf("原迷宫(Enter回车查看解法):\n");
Display();
getchar();
//(17, 0)为起点
Find(17, 0);
return 0;
#define N 19//整个迷宫大小(包括最外层墙壁)
char Maze[N][N] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
char step[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; //定义四个方向
int count = 0;
char Check(char i, char j) //判断下一步是不是通路
{
if (i >= 0 && i <= 18 && j >= 0 && j <= 18)
{
if (0 == Maze[i][j])
{
return 1;
}
}
return 0;
}
void Display(void)
{
char i, j;
for (i = 0; i<N; ++i)
{
for (j = 0; j<N; ++j)
{
printf("%d", Maze[i][j]);
}
printf("\n");
}
}
void Find(char ci, char cj)
{
char n;
if ((N - 1) == cj) //这个边界设置得比较粗糙,到N-1这个下标就算终点,没想到什么好的办法
{
Maze[ci][cj] = 6; //终点的最后一个6
printf("解法%d(Enter回车查看下一解法):\n", ++count);
Display();
getchar();
Maze[ci][cj] = 0;
}
else
{
for (n = 0; n<4; ++n)
{
if (Check(ci + step[n][0], cj + step[n][1])) //依然用Check实现判断:是否可以在某个方向走下一步
{
Maze[ci][cj] = 6; //6表示走过的路
Find(ci + step[n][0], cj + step[n][1]);
Maze[ci][cj] = 0; //传统回溯方法
}
}
}
}
int main(void)
{
printf("\t迷宫问题(1 墙壁 0 道路 6 解法)\n\n");
printf("原迷宫(Enter回车查看解法):\n");
Display();
getchar();
//(17, 0)为起点
Find(17, 0);
return 0;
}
0 0
- 用回溯法递归实现迷宫
- 小型迷宫实现---迷宫算法(递归回溯法)
- 数据结构 迷宫的非递归实现(回溯法)
- 迷宫(回溯,递归)
- 迷宫问题--非递归回溯 C语言实现
- 迷宫问题--非递归回溯 C语言实现
- 实现回溯法求走迷宫
- 走迷宫问题:回溯法和递归法
- 回溯法解决迷宫问题(方法1---递归)
- 【数据结构】用回溯法求解迷宫问题
- 走迷宫 回溯法
- 迷宫问题 回溯法
- 回溯法-迷宫问题
- 回溯法迷宫求解
- 回溯法求迷宫
- 车厢调度(回溯法)递归实现
- 回溯法 ----- 递归的一种实现
- 贪吃蛇,搜索迷宫,回溯法,java实现
- Java代码bi邮箱验证,找回密码
- Android之路——开发环境变更:WIN10、AndroidStudio
- Spring Mvc 3.1 之后如何配置messageConverters
- tpshop商城根据用户坐标,向数据库查找附近的商家
- Laravel之队列使用浅析
- 用回溯法递归实现迷宫
- 聊聊并发——生产者消费者模式
- javascript中 有用的小方法
- wc命令
- 三次握手和四次挥手
- .net framwork 4.0安装总结
- Java学习笔记 Day03
- hive的metastore的选择
- 最短的包含字符串