作成した経路を使ってスタートからゴールまでの最短経路を表示するプログラムを加えます。
まずは、結果配列を作りNONEでクリアします。
7.結果のクリア
関数名 ClearResult 戻り値 なし 引 数 結果 機 能 結果配列をNONEでクリアする |
void ClearResult(int result[ROW][COL]) { int i; int j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { result[i][j] = NONE; } } } |
main関数に結果配列resultとClearResult関数の呼び出しを追加します。
<sample program 157-01>
int main(void) { int maze[ROW][COL]; int path[ROW][COL]; int result[ROW][COL]; srand((unsigned int)time(NULL)); InitializeMaze(maze); GenerateMaze(maze); ShowMaze(maze); ClearPath(path); CheckPath(maze, path, START_X, START_Y, 1); ShowPath(path); ClearResult(result); return 0; } |
<実行結果>
■■■■■■■■■■■ ■S□□■□□□■□■ ■■■□■□■■■□■ ■□□□□□□□□□■ ■□■□■■■■■■■ ■□■□□□□□■□■ ■□■□■■■■■□■ ■□■□■□□□□□■ ■■■□■□■□■□■ ■□□□□□■□■G■ ■■■■■■■■■■■ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 2 3 -1 9 10 11 -1 13 -1 -1 -1 -1 4 -1 8 -1 -1 -1 12 -1 -1 7 6 5 6 7 8 9 10 11 -1 -1 8 -1 6 -1 -1 -1 -1 -1 -1 -1 -1 9 -1 7 8 9 10 11 -1 21 -1 -1 10 -1 8 -1 -1 -1 -1 -1 20 -1 -1 11 -1 9 -1 15 16 17 18 19 -1 -1 -1 -1 10 -1 14 -1 18 -1 20 -1 -1 13 12 11 12 13 -1 19 -1 21 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 続行するには何かキーを押してください・・・
8.結果のセット
関数名 SetResult 戻り値 なし 引 数 経路、結果 機 能 経路配列から正しい経路を結果配列に移す |
void SetResult(const int path[ROW][COL], int result[ROW][COL]) { int x = GOAL_X; int y = GOAL_Y; int nowStep = path[y][x]; while (path[y][x] != 1) { result[y][x] = nowStep; if (path[y - 1][x] == nowStep - 1) { y--; } else { if (path[y][x + 1] == nowStep - 1) { x++; } else { if (path[y + 1][x] == nowStep - 1) { y++; } else { x--; } } } nowStep--; } result[y][x] = 1; } |
まずは、ゴールの歩数を取り出します。
そこから歩数が1小さいマスへ移動しつつ、結果配列に歩数を入れていきます。
これでスタートまでの最短経路が確定します。
※最短経路が複数ある場合は、その中の1つが選択されます。
<sample program 157-02>
int main(void) { int maze[ROW][COL]; int path[ROW][COL]; int result[ROW][COL]; srand((unsigned int)time(NULL)); InitializeMaze(maze); GenerateMaze(maze); ShowMaze(maze); ClearPath(path); CheckPath(maze, path, START_X, START_Y, 1); ShowPath(path); ClearResult(result); SetResult(path, result); return 0; } |
<実行結果>
■■■■■■■■■■■ ■S□□■□□□■□■ ■■■□■□■■■□■ ■□□□□□□□□□■ ■□■□■■■■■■■ ■□■□□□□□■□■ ■□■□■■■■■□■ ■□■□■□□□□□■ ■■■□■□■□■□■ ■□□□□□■□■G■ ■■■■■■■■■■■ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 2 3 -1 9 10 11 -1 13 -1 -1 -1 -1 4 -1 8 -1 -1 -1 12 -1 -1 7 6 5 6 7 8 9 10 11 -1 -1 8 -1 6 -1 -1 -1 -1 -1 -1 -1 -1 9 -1 7 8 9 10 11 -1 21 -1 -1 10 -1 8 -1 -1 -1 -1 -1 20 -1 -1 11 -1 9 -1 15 16 17 18 19 -1 -1 -1 -1 10 -1 14 -1 18 -1 20 -1 -1 13 12 11 12 13 -1 19 -1 21 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 続行するには何かキーを押してください・・・
9.結果の表示
関数名 ShowResult 戻り値 なし 引 数 結果 機 能 最短経路を表示する |
void ShowResult(const int result[ROW][COL]) { const char WALL[3] = "■"; int i; int j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (result[i][j] == NONE) { printf(WALL); } else { printf("%2d", result[i][j]); } } printf("\n"); } printf("\n"); } |
−1の個所は見づらいので、■を表示することにしました。
<sample program 157-03>
int main(void) { int maze[ROW][COL]; int path[ROW][COL]; int result[ROW][COL]; srand((unsigned int)time(NULL)); InitializeMaze(maze); GenerateMaze(maze); ShowMaze(maze); ClearPath(path); CheckPath(maze, path, START_X, START_Y, 1); ShowPath(path); ClearResult(result); SetResult(path, result); ShowResult(result); return 0; } |
<実行結果>
■■■■■■■■■■■ ■S□□■□□□■□■ ■■■□■□■■■□■ ■□□□□□□□□□■ ■□■□■■■■■■■ ■□■□□□□□■□■ ■□■□■■■■■□■ ■□■□■□□□□□■ ■■■□■□■□■□■ ■□□□□□■□■G■ ■■■■■■■■■■■ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 2 3 -1 9 10 11 -1 13 -1 -1 -1 -1 4 -1 8 -1 -1 -1 12 -1 -1 7 6 5 6 7 8 9 10 11 -1 -1 8 -1 6 -1 -1 -1 -1 -1 -1 -1 -1 9 -1 7 8 9 10 11 -1 21 -1 -1 10 -1 8 -1 -1 -1 -1 -1 20 -1 -1 11 -1 9 -1 15 16 17 18 19 -1 -1 -1 -1 10 -1 14 -1 18 -1 20 -1 -1 13 12 11 12 13 -1 19 -1 21 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ■■■■■■■■■■■ ■ 1 2 3■■■■■■■ ■■■ 4■■■■■■■ ■■■ 5■■■■■■■ ■■■ 6■■■■■■■ ■■■ 7■■■■■■■ ■■■ 8■■■■■■■ ■■■ 9■1516171819■ ■■■10■14■■■20■ ■■■111213■■■21■ ■■■■■■■■■■■ 続行するには何かキーを押してください・・・
完成しました!
↑の道が最短経路です。
ついでなので、さらに「おまけ」を作りましょう。