📅  最后修改于: 2023-12-03 15:12:47.297000             🧑  作者: Mango
这是一个名为“门”(Door)的游戏,是清华大学2010级CS专业数据结构课程的结课作业。
该游戏的主要目标是在“门”(即图形的边缘)中找到从起点到终点(两个绿色点)的最短路径。
此外,还需要注意以下几点:
该题目的主要难点在于寻找图中的最短路径。可以使用Dijkstra算法进行解决。
除此之外,还需要注意以下几个细节:
以下是该题目Dijkstra算法的Cpp代码实现,在主函数中输入图的结构体数组data[]和节点的总数N,即可输出起点到终点的最短路径:
void Dijkstra(DATA data[], int N, int start, int end) {
int* dist = new int[N];
bool* mark = new bool[N];
for (int i = 0; i < N; i++) {
dist[i] = MAX;
mark[i] = false;
}
dist[start] = 0;
int k, u;
for (int i = 0; i < N; i++) {
int minDist = MAX;
for (int j = 0; j < N; j++) {
if (!mark[j] && dist[j] < minDist) {
minDist = dist[j];
k = j;
}
}
if (minDist == MAX) break;
mark[k] = true;
for (int j = 0; j < N; j++) {
if (!mark[j] && data[k].adj[j] != MAX) {
int newDist = dist[k] + data[k].adj[j];
if (newDist < dist[j]) {
dist[j] = newDist;
data[j].pre = k;
}
}
}
}
vector<int> path;
path.push_back(end);
int index = end;
while (index != start) {
index = data[index].pre;
path.insert(path.begin(), index);
}
for (int i = 0; i < path.size(); i++) {
cout << path[i] << "->";
}
delete[] dist;
delete[] mark;
}
注:该段代码尽在表现Dijkstra算法部分逻辑的同时,并未包括所有程序文件和完整代码,同时也未包括完整测试代码。