POJ 3984 迷宮問題 搜尋題解,poj3984

來源:互聯網
上載者:User

POJ 3984 迷宮問題 搜尋題解,poj3984

本題可以使用BFS和DFS解題,也可以構建圖,然後利用Dijsktra解題。

不過因為資料很少,就沒必要使用Dijsktra了。

BFS和DFS效率都是一樣的,因為都需要搜尋所有可能的路徑,並記錄最短路徑和當前路徑。

推薦使用DFS,感覺會方便很多,BFS會麻煩很多,因為需要記錄並比較路徑。


#include <stdio.h>#include <string.h>#include <limits.h>const int MAX_N = 5;const int MAX_RES = MAX_N*MAX_N;int Maze[MAX_N][MAX_N];int Row[MAX_RES], Col[MAX_RES], resRow[MAX_RES], resCol[MAX_RES], N;const int BLOCK = 1;const int UNBLOCK = 0;inline bool isLegal(int r, int c){return 0<=r && 0<=c && r<MAX_N && c<MAX_N && Maze[r][c] == 0;}void getPath(int path = 0, int r = 0, int c = 0){Row[path] = r, Col[path] = c;if (r == MAX_N - 1 && c == MAX_N - 1){if (path+1 < N){N = path+1;memcpy(resRow, Row, sizeof(int)*N);memcpy(resCol, Col, sizeof(int)*N);}return ;}Maze[r][c] = BLOCK;if (isLegal(r, c+1)) getPath(path+1, r, c+1);if (isLegal(r+1, c)) getPath(path+1, r+1, c);if (isLegal(r, c-1)) getPath(path+1, r, c-1);if (isLegal(r-1, c)) getPath(path+1, r-1, c);Maze[r][c] = UNBLOCK;}int main(){for (int i = 0; i < MAX_N; i++){for (int j = 0; j < MAX_N; j++){scanf("%d", Maze[i]+j);}}N = INT_MAX;getPath();if (N != INT_MAX){for (int i = 0; i < N; i++){printf("(%d, %d)\n", resRow[i], resCol[i]);}}return 0;}




北大ACM3984,告訴我下面的代碼,我打出問號標記出來的那一段是什

每走一個格加多少並不重要,這個值即表示了每一個步的開銷,如果題中指定了每一步的開銷,就按題中說的值來加,否則,只要其值能保證計算的正確性就行,對本題來說,minn的初值為25,當然每次加的量不能使最終的最短距離比minn還大。LZ標記問號的部分確實冗餘,沒有必要這樣寫,把 count++;和 count--;去掉即可。
這段代碼中,tyr函數沒有進行任何有效剪枝,這樣的話該函數在資料量較大時將無法工作,所以可以稍加最佳化:使用一個數組記錄當前已知的點到左上方的距離,每遞迴到達一個點,均與該數組中相應的位置比較,如果比之小,則更新該數組,並遞迴,否則就剪枝。每一步都可能有4種分支,每次遞迴記錄下各自的選擇,這樣在擷取更優解時就把當前的選擇序列記錄下來,就是最終最優解的選擇序列。
 
poj 簡單題

我給你一些,我都試過一部分了,簡單,我也初學者。

POJ的:
poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094

浙大的也做做吧,挺好的:
1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242
1251 1292 1331 1334 1337 1338 1350 1365 1382 1383 1394 1402 1405 1414
1494 1514 1622 1715 1730 1755 1760 1763 1796 1813 1879 1889 1904 1915
1949 2001 2022 2099 2104 2108 2172 2176 2201 2208 2321 2345 2351 2376 2388
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.