`

回溯法解迷宫问题的两个解法

阅读更多

解法1:

/**//*
使用回溯法计算迷宫问题
*/

#include
<stdio.h>
#include
<stdlib.h>
structpos
...{
introw;
intcol;
}
;
voidmain()...{
intmaze[5][5]=...{
0,1,0,1,0,
0,0,0,1,0,
0,1,0,1,0,
0,1,0,0,0,
0,0,1,1,0
}
;//1表示障碍,0表示可以通过
intdir=1;//标记方向:上1左2下3右4
inti=0;
intj=0;
structpos
*stack=(structpos*)calloc(25,sizeof(structpos));
inttop=0;
while(true)...{
if(i==4&&j==4)...{//已经找到终点,打印结果
printf("Finish! Thepathis: ");
for(dir=0;dir<top;dir++)...{
printf(
"(");
printf(
"%d",stack[dir].row);
printf(
",");
printf(
"%d",stack[dir].col);
printf(
")");
}

printf(
"(4,4)");
break;
}

if(dir==1)...{
if(i>0&&*(*(maze+i-1)+j)==0//下一个位置不越界而且可以通过
&&!(stack[top-1].row==i-1&&stack[top-1].col==j))...{
//还需满足:这个将要走的位置不属于刚才走来的路!
stack[top].row=i;
stack[top].col
=j;
top
++;//进栈
i--;
dir
=1;//重置方向标识
}
else...{
dir
++;
}

}

elseif(dir==2)...{
if(j>0&&*(*(maze+i)+j-1)==0
&&!(stack[top-1].row==i&&stack[top-1].col==j-1))...{
stack[top].row
=i;
stack[top].col
=j;
top
++;
j
--;
dir
=1;
}
else...{
dir
++;
}

}

elseif(dir==3)...{
if(i<4&&*(*(maze+i+1)+j)==0
&&!(stack[top-1].row==i+1&&stack[top-1].col==j))...{
stack[top].row
=i;
stack[top].col
=j;
top
++;
i
++;
dir
=2;
}
else...{
dir
++;
}

}

else...{
if(j<4&&*(*(maze+i)+j+1)==0
&&!(stack[top-1].row==i&&stack[top-1].col==j+1))...{
stack[top].row
=i;
stack[top].col
=j;
top
++;
j
++;
dir
=1;
}
else...{//已经没有别的路了,只有回头
*(*(maze+i)+j)=1;//在回头前标识当前路为不能通过
i=stack[top-1].row;
j
=stack[top-1].col;
top
--;//出栈
dir=1;//重置方向标识符
}

}

}

}

 


解法2:

 

/**//*
使用回溯法计算迷宫问题
*/

#include
<stdio.h>
#include
<stdlib.h>
structpos
...{
introw;
intcol;
intdirection[5];//标记方向direction[1~4]上左下右
}
;
voidmain()...{
intmaze[5][5]=...{
0,1,0,1,0,
0,0,0,1,0,
0,1,0,1,0,
0,1,0,0,0,
0,0,1,1,0
}
;//1表示障碍,0表示可以通过
intdirection[5]=...{0};
intdir=1;//作为direction数组的下标
inti=0;
intj=0;
intcount=0;
structpos
*stack=(structpos*)calloc(25,sizeof(structpos));//栈,存放路径
inttop=0;

//将栈内元素全部初始化
for(count=0;count<25;count++)...{
stack[count].col
=0;
stack[count].row
=0;
for(intt=0;t<=4;t++)
stack[count].direction[t]
=0;
}


while(true)...{
if(i==1&&j==2)...{
intt=1;
}
;
if(i==4&&j==4)...{//已经找到终点,打印结果
printf("Finish! Thepathis: ");
for(count=0;count<top;count++)...{
printf(
"(");
printf(
"%d",stack[count].row);
printf(
",");
printf(
"%d",stack[count].col);
printf(
")");
}

printf(
"(4,4)");
break;
}

if(direction[1]==0
&&i>0
&&*(*(maze+i-1)+j)==0)...{//上方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col
=j;
direction[
1]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]
=direction[count];
direction[count]
=0;//使下一个位置方向状态初始化
}

direction[
3]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
direction[3]=1;
i
--;
}

elseif(direction[2]==0
&&j>0
&&*(*(maze+i)+j-1)==0)...{//左方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col
=j;
direction[
2]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]
=direction[count];
direction[count]
=0;//使下一个位置方向状态初始化
}

direction[
4]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
j--;
}

elseif(direction[3]==0
&&i<4
&&*(*(maze+i+1)+j)==0)...{//下方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col
=j;
direction[
3]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]
=direction[count];
direction[count]
=0;//使下一个位置方向状态初始化
}

direction[
1]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
i++;
}

elseif(direction[4]==0
&&j<4
&&*(*(maze+i)+j+1)==0)...{//右方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col
=j;
direction[
4]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]
=direction[count];
direction[count]
=0;//使下一个位置方向状态初始化
}

direction[
2]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
j++;
}
else...{//已经没有别的路了,只有回头
if(top==0)...{
printf(
"Nopath!");
break;
}

*(*(maze+i)+j)=1;//在回头前标识当前路为不能通过
top--;//出栈
i=stack[top].row;
j
=stack[top].col;
for(count=1;count<=4;count++)
direction[count]
=stack[top].direction[count];
}

//printf("(%d,%d)",i,j);
}
//while
}

 

分享到:
评论

相关推荐

    回溯算法的N皇后

    N皇后问题是一个经典的计算机科学问题,要求在N×N的棋盘上放置N个皇后,使得任意两个皇后都无法互相攻击,即任意两个皇后不在同一行、同一列或同一斜线上。这个问题有多种解法,其中包括前向检查的回溯法、基本回溯...

    数字迷宫、N皇后、杨辉三角、Akerman等代码

    2. **N皇后(NQueen)**:这是一个经典的回溯法问题,目标是在一个n×n的棋盘上放置n个皇后,使得任意两个皇后不能在同一行、同一列或对角线上。回溯法是一种试探性的解决问题的方法,当遇到无法满足条件的情况时,会...

    migong.rar_visual c

    八皇后问题则是算法设计的经典案例,它要求在国际象棋棋盘上放置八个皇后,使得任意两个皇后都无法互相攻击,即不在同一行、同一列或同一斜线上。 首先,我们来深入理解八皇后问题。这是一个回溯法的典型应用,它的...

    算法谜题PDF

    4. 回溯法:回溯法是一种通过探索所有可能的候选解来找出所有解的算法,如果候选解被确认不是一个解,则回溯返回,尝试其他可能性。它是解决约束满足问题的一种常用方法。 5. 汉诺塔问题:汉诺塔是一个经典的递归...

    C语言数据结构之迷宫问题

    栈是一种后进先出(LIFO)的数据结构,非常适合用来进行深度优先搜索(DFS)或者回溯法求解迷宫问题。 首先,我们定义了一些基本的数据结构。`Postype` 结构体用于存储迷宫中的坐标,包含两个整型成员 `x` 和 `y`,...

    迷宫问题的最短距离标记法递归求解 (2005年)

    迷宫问题的最短距离标记法递归求解的基本思路是:定义两个二维数组,一个用以表示迷宫本身,通常用1表示通道,用0表示墙壁;另一个数组用于存储迷宫中各点到起点的最短距离。算法的步骤通常如下: 1. 从迷宫的入口...

    n-queen.rar_queen

    n皇后问题,是计算机科学中一个经典的问题,主要涉及到了算法设计与分析,尤其是回溯法的运用。该问题要求在n×n的棋盘上放置n个皇后,使得任意两个皇后都无法在同一行、同一列或同一条对角线上攻击到彼此。这个任务...

    上海大学 算法

    这部分内容分为两个部分,分别探讨了动态规划的基本思想、状态转移方程以及常见问题的解法,如背包问题、最长公共子序列等。 第四章“贪心算法”注重局部最优解以期望得到全局最优解。这种算法通常用于资源分配问题...

    算法题目题

    **解法概述**:这是一个著名的图论问题,可以使用回溯法或者基于约束满足问题的算法来解决。核心思想是在给每个区域染色时避免颜色冲突。 --- ### 8\. 在n*n的正方形中放置长为2,宽为1的长条块 **问题描述**:...

    经典算法大全

    这实际上是一个哈密顿路径问题,是一个NP完全问题,通常采用回溯法求解。 7. 八皇后问题:八皇后问题要求在8×8的棋盘上放置八个皇后,使得它们互不攻击,即任何两个皇后都不在同一行、同一列或同一对角线上。这是...

    数据结构第5章.doc

    2. 迷宫问题和八皇后问题的解决,通常使用回溯法,即尝试所有可能的解决方案,直到找到一个可行的解或确定无解。 3. 单链表的递归解法和非递归解法,展示了如何将递归转换为迭代,以提高效率。 4. 广义表的节点计数...

    经典算法大全.pdf

    八皇后问题要求在8×8的棋盘上放置八个皇后,使得它们互不攻击(即任意两个皇后都不在同一行、同一列以及同一对角线上)。这是一个经典的约束满足问题,通常使用回溯法来求解。 7. 八枚硬币问题: 这个描述不详尽,...

    C语言经典算法大全.pdf

    - **八皇后问题**:在棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列或同一斜线上,这涉及到回溯法或位运算。 - **生命游戏**:一种细胞自动机,通过简单的规则模拟生命的演变。 - **排序算法**:如选择...

    数据结构第5章1

    2. 迷宫问题和八皇后问题,可以采用回溯法来寻找解决方案。 3. 对比单链表的递归解法和非递归解法,理解如何将递归问题转换为迭代解法。 4. 广义表相关的算法,如计算节点数量、深度、长度,以及判断相等、遍历等,...

    算法设计与分析课程期末考试复习题纲(研究生用).doc

    此外,还提及了王晓东教授著作中的迷宫问题、砝码称重问题、装载问题、圆排列问题、最长公共子串问题、多边形游戏问题和图像压缩问题。 动态规划在第八章被深入讨论,如计算二项式系数、数字三角形的最大路径、矩阵...

    数据结构相关操作

    逆波兰式通过栈数据结构实现计算,将表达式从左到右扫描,遇到数字则压入栈,遇到运算符则弹出栈顶的两个元素进行运算,并将结果压回栈中。这种方式简化了运算符优先级的处理,使得计算过程更为直观和高效。 3. ...

    经典算法大全.

    - **解法**:通常使用回溯法来解决这一问题。 #### 8. 八皇后 - **问题描述**:在一个8x8的棋盘上放置八个皇后,要求任何两个皇后不能处于同一行、同一列或相同的对角线上。 - **解法**:同样采用回溯法来解决。 #...

    c经典算法大全 word版本

    - 使用回溯法来寻找解。 - 可以使用启发式策略优化搜索过程,如选择下一步可跳位置最少的位置作为下一步的目标。 以上仅为部分知识点的简要说明。文档中还包含了更多经典的算法案例,例如背包问题、求质数的方法...

Global site tag (gtag.js) - Google Analytics