//回溯法求解过桥问题
#include <stdio.h>
int steps=0;//当前已经走过的步数
int minSteps=25;//到达终点的经过的格子数
int result=0;//所有满足条件的解的数量
int minStepsResult = 0;//经过格子数最少的解的数量
int axis_x[] = { 0,0,1,-1 };//下一个可能位置在x轴上的移动距离
int axis_y[] = { 1,-1,0,0 };//下一个可能位置在y轴上的移动距离
int grid[5][5] = {
{0,0,0,0,0},
{0,0,0,0,0},
{2,2,0,2,2},
{0,0,0,0,0},
{0,0,0,0,0}
};//5X5矩阵,0表示该位置可走但还未经过,1表示走过,2表示河流
//判断一个位置是否满足条件
bool isAvailable(int x,int y) {
//判断该位置是否超出范围
if (x < 0 || x > 4 || y < 0 || y > 4)
return false;
//已经走过的位置不走
if (grid[x][y] == 1)
return false;
//河流位置无法走
if (grid[x][y] == 2)
return false;
return true;
}
//打印最短路径
void printWay() {
printf("第%d种情况\n", minStepsResult);
for (int m = 0; m < 5; m++) {
for (int n = 0; n < 5; n++) {
printf("%3d", grid[m][n]);
}
printf("\n");
}
printf("\n");
}
void findNext(int x,int y,int m,int n) {
for (int i = 0; i < 4; i++) {
if (isAvailable(x + axis_x[i], y + axis_y[i])) {
grid[x + axis_x[i]][y + axis_y[i]] = 1;
steps++;
if (m == x + axis_x[i] && n == y + axis_y[i]) {
result++;
minSteps = steps < minSteps ? steps : minSteps;
if (steps == 9) {
minStepsResult++;
printWay();
}
}
findNext(x + axis_x[i], y + axis_y[i],m,n);
steps--;
grid[x + axis_x[i]][y + axis_y[i]] = 0;
}
}
}
int main() {
steps = 1;
grid[0][0] = 1;
findNext(0, 0, 4, 4);
printf("总计有%d种路线,其中最短路径如上所示\n", result);
getchar();
return 0;
}
回溯法求解过桥问题
最新推荐文章于 2020-03-03 00:27:36 发布