description
定義乙個二維陣列:
int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
input
乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一解。
output
左上角到右下角的最短路徑,格式如樣例所示。
sample input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
sample output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
題目分析
本題目和其他迷宮題目一樣,都要求求到最短路徑。但不同點在於這道題要輸出的是路徑過程而不是路徑長度,因此我們在結構體中不能只定義點的座標,還需要定義到達該點的上一步點的結構體陣列下標(father)。本題目需要用到之前的佇列資料,所以直接使用fifo佇列(queue)並不是特別方便,可以用陣列(que)來代替佇列,雖然浪費了空間,但是更加方便。
接下來在主函式(main)內,先定義乙個陣列(maze)表示迷宮,然後輸入。再將陣列que的第乙個元素(起點)的座標(x,y)賦值為(0,0)(左上角)。定義head和tail分別表示隊首和隊尾在que中的座標。
while迴圈head < tail(佇列不為空)。定義乙個向量f,分別指向四個方向。將隊尾元素的座標改變,然後隊尾元素的前一步下標應是head。判斷座標是否超界或是否為牆,再判斷當前位置是否為終點,若是,就要輸出答案,否則繼續迴圈。
輸出答案是本題的一大考點。我們為了節約空間,可以定義乙個動態陣列(vec),但是我們發現,只使用乙個結構體並不夠,我們還需要另乙個結構體(way)表示路徑的座標。先將當前的點存入vec,然後我們可以定義乙個元素(g)指向下標,初值為隊尾元素的father。然後進行乙個無限迴圈:1.將當前g指向的佇列元素座標存入vec;2.若當前點的位置是起點,則迴圈結束;3.g的值改變為當前g指向元素的father。由於我們是反向向起點倒推的,因此輸出也應該反向輸出。
程式樣例
#include
#include
//動態陣列標頭檔案
using
namespace
std;
struct point
que[30];//佇列
struct way
first;
int f[4][2]=,,,},head,tail=1; //向量,隊首,隊尾
bool maze[6][6]; //迷宮
int main()
int svec=vec.size();
for(int i=svec-1;i>=0;i--) //反向輸出
printf("(%d, %d)\n",vec[i].x,vec[i].y);
return
0; }
tail++;
}head++;
}return
0;}
openjudge 數字統計
總時間限制 1000ms 記憶體限制 100000kb 描述輸入n個整數,統計每個數出現的次數.輸入 第一行是乙個整數n 1 n 1000 接下來n行每行乙個整數.輸出 第一行輸出總共有多少個不同的整數.接下來每行輸出乙個整數及這個整數出現的次數,用空格分隔.輸出的整數的順序與它們在輸入中第一次出現...
Openjudge 括號匹配
這個用了普通的迴圈,資料量不是很大的話效率還是不錯的,如果資料比較大的話,換別的方法可能效率會高一點。思路很簡單 以字串中是否還存在沒有匹配過的 作為這個字串已經處理完畢的標誌。1,讀入字串,並進行處理,把所有不是 和 的字元都轉換成空格。2,從開始掃瞄字串,如果掃瞄到 記錄 的位置,直到掃瞄到 3...
openjudge 移動路線
描述 桌子上有乙個m行n列的方格矩陣,將每個方格用座標表示,行座標從下到上依次遞增,列座標從左至右依次遞增,左下角方格的座標為 1,1 則右上角方格的座標為 m,n 小明是個調皮的孩子,一天他捉來乙隻螞蟻,不小心把螞蟻的右腳弄傷了,於是螞蟻只能向上或向右移動。小明把這只螞蟻放在左下角的方格中,螞蟻從...