所以我一直在研究这个程序,它的目标是使用递归和邻接矩阵来找出一个人可以通过多少条可能的路线来通过地铁系统而无需多次穿越轨道。这对我来说是不言自明的,但现在我迷失在程序 2 上,这是用 C++ 和程序 1 做同样的问题,并使用三个类和递归。假设这些类是 SubwaySystem、Station 和 Track。我真的不知道如何从简单的邻接矩阵过渡到三个类?这似乎适得其反,因为它似乎更复杂。我已经研究了一段时间了,但我似乎无法利用所有三个课程。
我尝试过的方法是:我创建了一个包含 12 个车站的地铁系统,每个车站都有一系列轨道。例如,A 站有一个可以去的站 B。在 A 站有一组 12 条轨道,但只有 1 条轨道被激活。但是,由于我尝试在 Track 类中初始化数组,然后在 SubwaySystem 类中使用它们,因此我一直遇到错误。然后尝试使用递归来获取所有可能的路线会变得更加困难。我真的不知道如何解决这个问题。
我的代码中的邻接矩阵几乎映射了从站到站的整个连接。该站是 A - L 对应于每一行/列。如果不使用邻接矩阵,我不知道如何在 C++ 中表示它。
我的 C 代码(程序 1):
#include <stdio.h>
void routesFinder(int row, int col);
char station[13] = "ABCDEFGHIJKL";
char order[25] = "A";
int subway[12][12] = {{0,1,0,0,0,0,0,0,0,0,0,0},
{1,0,1,1,1,1,0,0,0,0,0,0},
{0,1,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,1,0,0,0,0,0,0,0},
{0,1,1,1,0,0,1,1,0,0,0,0},
{0,1,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,1,0},
{0,0,0,0,1,1,0,0,1,1,1,0},
{0,0,0,0,0,0,0,1,0,0,1,0},
{0,0,0,0,0,0,0,1,0,0,1,0},
{0,0,0,0,0,0,1,1,1,1,0,1},
{0,0,0,0,0,0,0,0,0,0,1,0}};
int paths = 0, i = 1;
int main(){
routesFinder(0, 0); //start with first station row, first column
printf("\n%d days before repeating a route.\n", paths);
return 0;
}
void routesFinder(int row, int col) {
while (col < 12) { //go through columns of a row
if (subway[row][col] == 0) { // if no station is found in row
if (row == 11) { // station found
paths++;
printf("Route %d: %s.\n", paths, order);
return;
}
col++;
if (row != 11 && col == 12) { //backtracking from deadend
return;
}
}
if (subway[row][col] == 1) {
order[i] = station[col]; //add station to route
i++; //increment, prepare for next route
subway[row][col] = 0; //no track forward
subway[col][row] = 0; // or backward
routesFinder(col, 0); //recursion, look for path in new row
order[i] = '\0'; //remove route
i--; //decrement, prepare for next route
subway[row][col] = 1; //restore path
subway[col][row] = 1; // restore path
col++; //returning from deadend, check for next open path
if (row != 11 && col == 12) { //return from deadend
return;
}
}
}
}