簡體   English   中英

如何在C語言中通過遞歸找到迷宮的路徑

[英]How to find a path through a maze with recursion in C

我必須使用C語言構建一個遞歸函數,以檢查矩陣中是否有路徑(NxN大小,內部只有0和1個輸入),該路徑從左上角開始,在右下角結束。 我只允許通過零,然后上下左右走。

我從左上角的(0,0)開始路徑

我試過了,但是效果不佳。

int x = 0, y = 0;
int isPathExist(char board[][N], int row, int col)
{

    board[x][y] = 1;

    if (x == N - 1 && y == N - 1) {
        return 1;
    }

    if (x + 1 < N && board[x + 1][y] == 0) {
        if (isPathExist(board, x + 1, y)) {
            return 1;
        }
    }

    if (x - 1 >= 0 && board[x - 1][y] == 0) {
        if (isPathExist(board, x - 1, y)) {
            return 1;
        }
    }

    if (y + 1 < N && board[x][y + 1] == 0) {
        if (isPathExist(board, x, y + 1)) {
            return 1;
        }
    }

    if (y - 1 >= 0 && board[x][y - 1] == 0) {
        if (isPathExist(board, x, y - 1)) {
            return 1;
        }
    }

    board[x][y] = 0;

    return 0;
}

基本(最簡單)的方法是“將左(或右)手放在牆上”。 這意味着執行這些步驟的循環:

  • 根據您上次移動時所面對的方向,以順時針方向確定要移動的方向(例如,如果您向北移動,請檢查是否可以先向西,然后向北,然后向東,然后向南)。

  • 向您確定可以移動的第一個方向移動

  • 請檢查您之前是否曾去過此地點,如果有的話,請放棄您已走過的那部分路徑。 例如,如果您向北移動到死胡同,然后又不得不向南移動,請修改目前所走的路徑,以使您看起來從未像最初那樣向北走。 這可以通過對步數進行編號來完成,這很容易-每次您移至一個從未有過的位置時,請在該位置存儲一個“我已經移動了多少次”值,以便以后可以使用該值可以更輕松地丟棄先前采用的路徑的那部分。 先前采用的路徑可以是“位置或已丟棄”值的數組,其中“每個移動的數量”作為索引。

  • 檢查您是否已經到達出口,以及是否還沒有回到起點。

在實現此循環后(無遞歸)並檢查以確保其正確運行; 您只需要通過某種方式將不必要的遞歸夯入代碼,就可以使代碼變得更慢(更慢,更難閱讀,並且更有可能因耗盡堆棧空間而崩潰)。 最簡單的方法是修改循環,以使最后一件事(“檢查是否到達出口,是否還沒有循環回到起點”)成為函數調用(“檢查是否已經到達出口,並且如果您還沒有打電話給自己,“)。

警告: 您的問題是說“找到路徑”,而該算法將做到這一點。 但是,如果有多個可能的路徑,則此算法可能找不到最短的路徑(或最長的路徑)。 由於這個原因(假設它是單項作業或其他),我建議檢查要求以確保“任何路徑”都可接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM