1. 程式人生 > >給定一個8*8的方格子,A點到B點的最短路徑有多少條?

給定一個8*8的方格子,A點到B點的最短路徑有多少條?

題目:給定一個8*8的方格子,如下圖所示,求A點到B點的最短路徑有多少條?用演算法實現。(回溯法)

廣度優先搜尋只能找出一條最短路徑

  答:從圖中可以看出,A點到B點的最短路徑為16,即A點橫走8小格,縱走8小格才能最快到達B點,這是排列組合的問題,即從最短路徑16中選取8個橫走的小格子(或者從最短路徑16中選取8個縱走的小格子)。所以從A點到B點的最短路徑條數,直接可以算出來,即為:

  程式碼如下:

size_t g_num = 0;  //統計A點到B點的最短路徑條數

void shortestPathNumber(char grid[9][9], int row, int
col, int &step) { if (row < 0 || row > 8 || col < 0 || col > 8 || grid[row][col] == '*' || step > 16) { return; } if (row == 0 && col == 8) { if (step == 16) //已到達B點,且等於最短路徑16,就累加 { g_num++; } } else { grid[row][col]
= '*'; //標記該點已訪問 step++; shortestPathNumber(grid, row, col + 1, step); //向4個方向走 shortestPathNumber(grid, row + 1, col, step); shortestPathNumber(grid, row, col - 1, step); shortestPathNumber(grid, row - 1, col, step); grid[row][col] = '.'; //回溯 step--; } }
int _tmain(int argc, _TCHAR* argv[]) { char grid[9][9] = {0}; int step = 0; shortestPathNumber(grid, 8, 0, step); //從A點開始搜尋 cout<<"A點到B點的最短路徑條數為: "<<g_num<<endl; return 0; }