gpt4 book ai didi

c - BackTracking 功能未按预期工作

转载 作者:行者123 更新时间:2023-11-30 14:32:45 24 4
gpt4 key购买 nike

我正在尝试使用 C 中的 BackTracking 解决以下问题,但我不知道如何从这里继续...

问题是:

克里斯计划去一个有 N 个城市的国家旅行。他将得到一个矩阵 NxN 的帮助,其中单元格 (I,J) 代表从城市 I 到城市 J 的道路长度。与从城市 B 到城市 A 的道路相比,从城市 A 到城市 B 的道路长度并不相同。从同一源城市返回(直接)的道路为 0。克里斯注意到从 A 到 B 的最短路线并不总是连接两个城市的直接道路。您需要帮助克里斯找到最短路径。编写一个函数,在给定存储道路长度值的 NxN 矩阵的情况下检查最短 map 。注:N定义为4。

示例:

如果给定以下矩阵,从 0 到 1 的最短路径是先到城市 0,然后到 3,然后到 1:

0 5 2 2

1 0 1 1

1 2 0 1

1 1 2 0

她是我的代码:

int ShortestPath (int SourceCity, int DestinationCity, int Distance [][N], bool Chosen[][N])
{
int Path=0;
if (SourceCity==DestinationCity)
{
Distance[SourceCity][DestinationCity]=true;
return 0;
}

for (int i=0;i<N;i++)
{
for (int j=0;j<N;j++)
{
Path += Distance[i][j];
if (!Chosen[i][j])
{
Chosen[i][j] = true;
ShortestPath(i, DestinationCity, Distance, Chosen);
}
}
}
if (Path>=Distance[SourceCity][DestinationCity])
{
Chosen[SourceCity,DestinationCity]=false;
return Distance[SourceCity][DestinationCity];
}
}

注意:选择的矩阵表示我是否选择了特定道路(其初始值均为 false)

最佳答案

这是一个建议的解决方案。它是寻找最短路径的 Dijkstra 算法的实现。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>

// number of nodes
#define N 4
// distance matrix from i to j for d[i][j]
int d[N][N] = {
{0, 5, 2, 2},
{1, 0, 1, 1},
{1, 2, 0, 1},
{1, 1, 2, 0},
};


// shortestPath stores in path the shortest path from start node to
// final node using the distance matrix d. It returns the number of
// nodes in the path.
int shortestPath(int d[N][N], int start, int final, int path[N]){
// node previous to node i
int prev[N];

// initialize distance from node i to start as infinite
int dist[N];
for (int i = 0; i < N; i++)
dist[i] = INT_MAX;
dist[start] = 0;

// initialize list of nodes done
bool done[N];
for (int i = 0; i < N; i++)
done[i] = false;
int nDone = 0;

// while we haven’t done all nodes
while (nDone < N) {
// find not yet done node with minimal distance to start node
int minDist = INT_MAX;
int n; // node with minimum distance
for (int i = 0; i < N; i++)
if (!done[i] && dist[i] < minDist)
minDist = dist[n = i];
done[n] = true;
nDone++;
// we can stop when final node is done
if (n == final)
break;

// for every node j...
for (int j = 0; j < N; j++) {
// if node j is not yet done,
// and distance from start to j through n is smaller to known
if (!done[j] && dist[j] > dist[n] + d[n][j]) {
// set new shortest distance
dist[j] = dist[n] + d[n][j];
// set node n as previous to node j
prev[j] = n;
}
}
}

// get path [start, ..., final]
int j = N;
for (int i = final; i != start; i = prev[i])
path[--j] = i;
path[--j] = start;
if (j == 0)
return N;
int n = N-j;
for (int i = 0; i < n; i++, j++)
path[i] = path[j];
return n;
}

int main() {
int path[N];
int n = shortestPath(d, 0, 1, path);

printf("path: %d", path[0]);
for (int i = 1; i < n; i++)
printf("->%d", path[i]);
printf("\n");
return 0;
}

输出

path: 0->3->1

关于c - BackTracking 功能未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59689774/

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