gpt4 book ai didi

c++ - 无法在迷宫中追踪灰色细胞

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:01:29 26 4
gpt4 key购买 nike

有一个矩阵,其中包含白色单元格(表示为1),黑色单元格(表示为0)和只有一个灰色单元格(表示为2),需要从(0,0)到(N-1, N-1) 数组[N][N].

约束:

1) 路径应该只覆盖白色单元格并且必须经过灰色单元格(这个灰色单元格可以在数组中的任何位置)

2) 访问过的节点不能再次访问。

以下是典型的迷宫问题解决方案,但此解决方案无法处理遍历灰色单元格的特定情况...因此您能否帮我修改以下代码以处理特定情况。

我的问题是我不确定如何检查灰色单元格?

#include "stdafx.h"
#include "algorithm"
#include <iostream>
#include <fstream>
using namespace std;
#include<stdio.h>

// Maze size
#define N 4

bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]);

/* A utility function to print solution matrix sol[N][N] */
void printSolution(int sol[N][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
printf(" %d ", sol[i][j]);
printf("\n");
}
}

/* A utility function to check if x,y is valid index for N*N maze */
bool isSafe(int maze[N][N], int x, int y)
{
//solveMazeUtil() to solve the problem. It returns false if no path is possible,
//otherwise return true and prints the path in the form of 1s. Please note that
//there may be more than one solutions, this function prints one of the feasible
if(x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 1)
// if (x,y outside maze) return false
return true;

return false;
}

/* This function solves the Maze problem using Backtracking. It mainly uses
solutions.*/
bool solveMaze(int maze[N][N])
{
int sol[N][N] = { {0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
};

if(solveMazeUtil(maze, 0, 0, sol) == false)
{
printf("Solution doesn't exist");
return false;
}

printSolution(sol);
return true;
}

/* A recursive utility function to solve Maze problem */
bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N])
{
// if (x,y is goal) return true
if(x == N-1 && y == N-1)
{
sol[x][y] = 1;
return true;
}

// Check if maze[x][y] is valid
if(isSafe(maze, x, y) == true)
{
// mark x,y as part of solution path
sol[x][y] = 1;

/* Move forward in x direction */
if (solveMazeUtil(maze, x+1, y, sol) == true)
return true;

/* If x moving in x direction doesn't give solution then
Move down in y direction */
if (solveMazeUtil(maze, x, y+1, sol) == true)
return true;

/* If none of the above movements work then BACKTRACK:
unmark x,y as part of solution path */
sol[x][y] = 0;
return false;
}

return false;
}

// driver program to test above function
int main()
{
int maze[N][N] = { {1, 0, 0, 0},
{1, 1, 0, 1},
{0, 1, 0, 0},
{1, 1, 1, 1}
};

solveMaze(maze);
getchar();
return 0;
}

我想到的一个解决方案是:

产生所有可能的路径(遍历 1 或 2)。

然后,找出哪条路径中有2。然后打印该路径作为输出。

但我认为这不是好的方法...所以,请让我知道如何以体面的方式实现我的目标。谢谢

最佳答案

因为在你的代码中你只使用了两种可能的移动:向下和向右那么这是一个 DAG . DAG 适用于动态规划方法:每个单元格有两种到达那里的可能性,一种来自上方,另一种来自左侧。因此,单元格的最小距离是:

cost[i][j] = min(cost[i][j-1],cost[i-1][j]) + 1

这是考虑到做一次运动的成本是1。如果单元格是黑色的,你可以给它无限的成本,你只需要找到一条从P1(start)到的路径P2(gray cell) 然后是从 P2P3(goal) 的路径。

为了重建路径,您可以创建另一个父矩阵 pi[N][N],如果最短路径来自上面,则 pi[i][j] = ( i-1, j) 如果来自左边 pi[i][j] = (i, j-1) 如果不可能到达那个单元格 pi[i ][j] = null(随便你)

关于c++ - 无法在迷宫中追踪灰色细胞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19478345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com