`
- 浏览:
1163564 次
- 性别:
- 来自:
北京
-
解法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
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
N皇后问题是一个经典的计算机科学问题,要求在N×N的棋盘上放置N个皇后,使得任意两个皇后都无法互相攻击,即任意两个皇后不在同一行、同一列或同一斜线上。这个问题有多种解法,其中包括前向检查的回溯法、基本回溯...
2. **N皇后(NQueen)**:这是一个经典的回溯法问题,目标是在一个n×n的棋盘上放置n个皇后,使得任意两个皇后不能在同一行、同一列或对角线上。回溯法是一种试探性的解决问题的方法,当遇到无法满足条件的情况时,会...
八皇后问题则是算法设计的经典案例,它要求在国际象棋棋盘上放置八个皇后,使得任意两个皇后都无法互相攻击,即不在同一行、同一列或同一斜线上。 首先,我们来深入理解八皇后问题。这是一个回溯法的典型应用,它的...
4. 回溯法:回溯法是一种通过探索所有可能的候选解来找出所有解的算法,如果候选解被确认不是一个解,则回溯返回,尝试其他可能性。它是解决约束满足问题的一种常用方法。 5. 汉诺塔问题:汉诺塔是一个经典的递归...
栈是一种后进先出(LIFO)的数据结构,非常适合用来进行深度优先搜索(DFS)或者回溯法求解迷宫问题。 首先,我们定义了一些基本的数据结构。`Postype` 结构体用于存储迷宫中的坐标,包含两个整型成员 `x` 和 `y`,...
迷宫问题的最短距离标记法递归求解的基本思路是:定义两个二维数组,一个用以表示迷宫本身,通常用1表示通道,用0表示墙壁;另一个数组用于存储迷宫中各点到起点的最短距离。算法的步骤通常如下: 1. 从迷宫的入口...
n皇后问题,是计算机科学中一个经典的问题,主要涉及到了算法设计与分析,尤其是回溯法的运用。该问题要求在n×n的棋盘上放置n个皇后,使得任意两个皇后都无法在同一行、同一列或同一条对角线上攻击到彼此。这个任务...
这部分内容分为两个部分,分别探讨了动态规划的基本思想、状态转移方程以及常见问题的解法,如背包问题、最长公共子序列等。 第四章“贪心算法”注重局部最优解以期望得到全局最优解。这种算法通常用于资源分配问题...
**解法概述**:这是一个著名的图论问题,可以使用回溯法或者基于约束满足问题的算法来解决。核心思想是在给每个区域染色时避免颜色冲突。 --- ### 8\. 在n*n的正方形中放置长为2,宽为1的长条块 **问题描述**:...
这实际上是一个哈密顿路径问题,是一个NP完全问题,通常采用回溯法求解。 7. 八皇后问题:八皇后问题要求在8×8的棋盘上放置八个皇后,使得它们互不攻击,即任何两个皇后都不在同一行、同一列或同一对角线上。这是...
2. 迷宫问题和八皇后问题的解决,通常使用回溯法,即尝试所有可能的解决方案,直到找到一个可行的解或确定无解。 3. 单链表的递归解法和非递归解法,展示了如何将递归转换为迭代,以提高效率。 4. 广义表的节点计数...
八皇后问题要求在8×8的棋盘上放置八个皇后,使得它们互不攻击(即任意两个皇后都不在同一行、同一列以及同一对角线上)。这是一个经典的约束满足问题,通常使用回溯法来求解。 7. 八枚硬币问题: 这个描述不详尽,...
- **八皇后问题**:在棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列或同一斜线上,这涉及到回溯法或位运算。 - **生命游戏**:一种细胞自动机,通过简单的规则模拟生命的演变。 - **排序算法**:如选择...
2. 迷宫问题和八皇后问题,可以采用回溯法来寻找解决方案。 3. 对比单链表的递归解法和非递归解法,理解如何将递归问题转换为迭代解法。 4. 广义表相关的算法,如计算节点数量、深度、长度,以及判断相等、遍历等,...
此外,还提及了王晓东教授著作中的迷宫问题、砝码称重问题、装载问题、圆排列问题、最长公共子串问题、多边形游戏问题和图像压缩问题。 动态规划在第八章被深入讨论,如计算二项式系数、数字三角形的最大路径、矩阵...
逆波兰式通过栈数据结构实现计算,将表达式从左到右扫描,遇到数字则压入栈,遇到运算符则弹出栈顶的两个元素进行运算,并将结果压回栈中。这种方式简化了运算符优先级的处理,使得计算过程更为直观和高效。 3. ...
- **解法**:通常使用回溯法来解决这一问题。 #### 8. 八皇后 - **问题描述**:在一个8x8的棋盘上放置八个皇后,要求任何两个皇后不能处于同一行、同一列或相同的对角线上。 - **解法**:同样采用回溯法来解决。 #...
- 使用回溯法来寻找解。 - 可以使用启发式策略优化搜索过程,如选择下一步可跳位置最少的位置作为下一步的目标。 以上仅为部分知识点的简要说明。文档中还包含了更多经典的算法案例,例如背包问题、求质数的方法...