★関数(再帰呼び出し11)★


作成した経路を使ってスタートからゴールまでの最短経路を表示するプログラムを加えます。

まずは、結果配列を作り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■
■■■■■■■■■■■

続行するには何かキーを押してください・・・

完成しました!

↑の道が最短経路です。

ついでなので、さらに「おまけ」を作りましょう。


次へ

戻る

目次へ