時間限制: 1 sec 記憶體限制: 128 mb
提交: 239 解決: 80
[提交][狀態][討論版][命題人:外部匯入]
有乙個n*m格的迷宮(表示有n行、m列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,檔案讀入這n*m個資料和起始點、結束點(起始點和結束點都是用兩個資料來描述的,分別表示這個點的行號和列號)。現在要你程式設計找出所有可行的道路,要求所走的路中沒有重複的點,走時只能是上下左右四個方向。如果一條路都不可行,則輸出相應資訊(用-l表示無路)。
請統一用 左上右下的順序拓展,也就是 (0,-1),(-1,0),(0,1),(1,0)
第一行是兩個數n,m( 1 < n , m < 15 ),接下來是m行n列由1和0組成的資料,最後兩行是起始點和結束點。
所有可行的路徑,描述乙個點時用(x,y)的形式,除開始點外,其他的都要用「->」表示方向。
如果沒有一條可行的路則輸出-1。
5 61 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 15 6
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)【演算法分析】(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
用乙個a陣列來存放迷宮可走的情況,另外用乙個陣列b來存放哪些點走過了。每個點用兩個數字來描述,乙個表示行號,另乙個表示列號。對於某乙個點(x,y),四個可能走的方向的點描述如下表:
2 1 x,y 3
4 對應的位置為:(x, y-1),(x-1, y),(x, y+1),(x+1, y)。所以每個點都要試探四個方向,如果沒有走過(陣列b相應的點的值為0)且可以走(陣列a相應點的值為1)同時不越界,就走過去,再看有沒有到達終點,到了終點則輸出所走的路,否則繼續走下去。
這個查詢過程用search來描述如下:
procedure search(x, y, b, p);
begin
for i:=1 to 4 do
begin
先記住當前點的位置,已走過的情況和走過的路;
如果第i個點(xl,y1)可以走,則走過去;
如果已達終點,則輸出所走的路徑並置有路可走的資訊,
否則繼續從新的點往下查詢search(xl,y1,b1,p1);
end;
end;
有些情況很明顯是無解的,如從起點到終點的矩形中有一行或一列都是為0的,明顯道路不通,對於這種情況要很快地「剪掉」多餘分枝得出結論,這就是搜尋裡所說的「剪枝」。從起點開始往下的一層層的結點,看起來如同樹枝一樣,對於其中的「枯枝」——明顯無用的節點可以先行「剪掉」,從而提高搜尋速度。
#includeusing namespace std;
int a[20][20], endx, endy, m, n;
bool no = true;
int dx[4] = , dy[4] = ;
struct route route[5000];
void dfs(int x, int y, int num)
cout << "(" << x << "," << y << ")" << endl;
no = false;
return;
} route[num].x = x, route[num].y = y;
for (int i = 0; i < 4; i++) }}
int main()
} int startx, starty;
cin >> startx >> starty >> endx >> endy;
dfs(startx, starty, 0);
if (no) cout << -1 << endl;
} return 0;
}
遞迴入門自學
例題 計算給定的n個數的和 分析 顯然當n 0的a 0 為所求,因此可以將前n項可以看做是前n 1 即 a 0,n 2 項的和加上第n項 int sum int a,int n 如上演算法中的sum 在進行遞迴呼叫的時對自身的呼叫最多隻會進行一次,也就是在每一層次上至多只有乙個例項,且構成乙個線性結...
《遞迴入門》之回文
所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的。比如 level aaabbaaa 題目 判斷乙個字串是否為回文 解法 遞迴 遞迴的作用在於把問題的規模不斷縮少,直到問題縮少到能簡單地解決 問 如何縮少問題規模?答 通過觀察可以知道,乙個回文字串其中內部也是回文。所以,我們只需要以去...
C語言 遞迴入門
遞迴是什麼,遞迴就是一種解決問題的方法 程式自身呼叫自身叫做遞迴。它的核心在於 大事化小!先舉幾個例子 1.接受乙個整型值,按順序列印它的每一位。只考慮正數 如 1234 應輸出1 2 3 4 1 先討論如果不遞迴該怎樣處理,一般步驟是這樣的,先判斷這個數是幾位數,然後在記錄下這個數的每一位,最後輸...