首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 迷宮遊戲 BFS 求路徑:代碼邏輯解析與常見編譯錯誤排查

     編輯:程式設計疑難解答

代碼邏輯解析:基於隊列的廣度優先搜索 (BFS)

提供的代碼實現了經典的迷宮最短路徑查找:

  • 數據結構: int mg[10][10] 迷宮地圖(1=牆,0=路),結構體 Qu 模擬隊列節點(座標 i,j + 前驅索引 pre)。
  • 算法流程:
    1. 入口 (1,1) 入隊,標記 mg[1][1]=-1 表示已訪問。
    2. 循環出隊當前節點,檢查是否到達終點 (M,N)。
    3. 若未到達,嘗試上右下左四個方向:座標合法且 mg[ni][nj]==0 則入隊、標記 -1、記錄前驅。
    4. 隊列耗盡未到達終點則輸出 "NO WAY"。
    5. 到達終點後,print() 通過前驅索引回溯路徑並輸出。

關鍵邏輯細節

// 方向向量:上、右、下、左
int di[4] = {-1, 0, 1, 0};
int dj[4] = {0, 1, 0, -1};

for (int k = 0; k < 4; k++) {
    int ni = q[front].i + di[k];
    int nj = q[front].j + dj[k];
    if (mg[ni][nj] == 0) { // 可走且未訪問
        rear++;
        q[rear].i = ni;
        q[rear].j = nj;
        q[rear].pre = front; // 記錄前驅,用於回溯
        mg[ni][nj] = -1;     // 標記已訪問
    }
}

常見編譯/運行錯誤及修復

錯誤現象可能原因修復建議
fatal error C1004: unexpected end of file found大括號 {} 不匹配,常見於 if/while/for 缺少右大括號使用 IDE 自動縮進/匹配高亮檢查,確保每層邏輯閉合
struct/class 定義後缺少分號struct Qu { ... } 末尾漏寫 ;結構體/類定義結尾必須加分號
#if 無對應 #endif條件編譯塊未閉合補全 #endif
預編譯頭文件錯誤VS 預設要求 #include "stdafx.h" 在第一行添加 #include "stdafx.h" 或項目屬性 → C/C++ → 預編譯標頭 → "不使用預編譯標頭"
main 返回類型非 intvoid main() 不標準改為 int main() { ... return 0; }
數組越界風險未檢查 ni, nj 是否在 [0,9] 範圍內入隊前加邊界判斷 ni>=0 && ni<10 && nj>=0 && nj<10

改進建議

  • 使用 std::queue<Node> 替代手寫數組隊列,代碼更簡潔安全。
  • 引入 vector<vector<int>> 動態存儲迷宮,支持任意尺寸。
  • 路徑回溯邏輯可優化:從終點反向追蹤前驅存入 vector 再反轉輸出。
  • 增加可視化:用圖形庫(EasyX、SFML、Qt)繪製迷宮與路徑動畫。

總結

該代碼正確實現了 BFS 迷宮尋路核心邏輯。編譯失敗多源于 **C++ 基礎語法細節(括號、分號、main簽名、預編譯頭)**,而非算法邏輯。建議開啟編譯器警告等級(/Wall 或 -Wall),善用 IDE 代碼折疊/匹配功能快速定位語法錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved