程式設計筆試題之路徑最短

2021-10-04 21:09:27 字數 3296 閱讀 7000

小強有一天想去郊區玩,但是路上會經過一片山路,山路可以看成是乙個n∗m

n*mn∗

m(nn

n行mm

m列)的網格,每個網格代表乙個區域,山路崎嶇不平,每乙個區域都有乙個會消耗的體力值。小強在走山路的時候,只能從乙個區域走到相鄰的4個(上下左右的網格)區域中的任意乙個。每到乙個區域,會消耗對應的體力值。小強初始位置在第一行上方,需要去到第n

nn行下方(可以在第一行任意區域作為起點,n

nn行任意區域作為終點)

小強想找一種走訪,使得經過山路的總體力值最小。請你幫助小強找打這麼一條路,並輸出最小的總體力值消耗。

輸入描述:

第一行包含兩個數字n,m

n,mn,

m,分別代表山路的行數和列數

接下來有n

nn行,每行m

mm個數字。第i

ii行j

jj列的數字vij

v_vi

j​,代表對應位置的區域的體力值。

示例1輸入

3 4

9 9 1 1

9 1 1 9

1 1 9 9

輸出
4
示例2

輸入10103

5491

2196

193319

1234

53710

9020

輸出

20
把每列和的最小值記為sum

line

sumline

sumlin

e,temp

loss

temploss

templo

ss的值初始化為9999

把第一行第一列作為第乙個位置,計算第乙個位置與徑直向下位置的和,記為los

sloss

loss

。計算第乙個位置los

sloss

loss

到第乙個位置的左側和左側的徑直下方的和是否小於tem

plos

stemploss

templo

ss,小於的話賦值給tem

plos

stemploss

templo

ss,並記錄當前列。計算當前列從第一行到當前行的所有值的大小,和tem

plos

stemploss

templo

ss比較,小的話賦值給tem

plos

stemploss

templo

ss。繼續向左側比較。

同理,比較右側。

遍歷第一行的所有列,找出最小的消耗值。

#include using namespace std;

#include //void shortestpath(int startrow, int startcol, const int m, const int n, vector> a, int &firval, int loss )

startcol: 開始的座標點,從(0,0)開始

陣列的維度,m行n列

動態二維陣列

列方向的損失值,初始化為列方向的最小值,結果保留在此

列方向損失值

void shortestpath(int startrow, int startcol, const int m, const int n, vector> a, int &firval, int loss )

// end for

if (sum < temploss)

//cout << "a[row - 1][i]: " << a[(row - 1) *n + i];

cout << "左更新: (" << row << "," << i << ")" << endl; // 輸出當前位置

}// end if

} // end for left

//cout << "左:loss結果為:" << temploss << endl << endl;

// 判斷右邊是否有比它小的路徑

int right_temp = 0;

for (int i = col; i < n; i++) // 下一列遞加往右走判斷

if (sum < temploss)

//cout << "a[row - 1][i]:" << a[(row - 1) * n + i];

cout << "右更新: (" << row << "," << i << ")" << endl; // 輸出當前的位置

}} // end for right

//cout << "右:loss結果為:" << temploss << endl;

// 每次都更新,loss每輪至少直接加下一行

loss = temploss; // 右側找完賦值給loss

if (col_update != -1)

else

row++; // 更新行

} // end while 搜尋結束

if (loss < firval)

cout << "firval: " << firval << endl << endl;

// 是否到達最後一行?是的話和列的最小和比較,是否比它小?小的話返回,不小的話繼續遞迴

if (startcol < n - 1)

} // end shortestpath

int main()

} //int a[3][4] = ;

/*int a[3][3] = ;*/

//int a[5][5] = ;

for (int i = 0; i < m; i++)

cout << endl;

} // 列下標求和的最小值賦值給sum

int sumline = 9999;

int sumcol = 0;

for (int i = 0; i < n; i++)

if (sumcol < sumline)

}int loss = 0;

cout << "sumline: " << sumline << endl;

// sumline作為最終的列損失值返回

shortestpath(0, 0, m, n, a, sumline, loss);

cout << "所有的損失為:" << sumline << endl;

system("pause");

return 0;

}

大家如果有更好的想法可以一起討論,讓智慧型的火花進行碰撞。

程式設計筆試題

單向鍊錶的反轉是乙個經常被問到的乙個面試題,也是乙個非常基礎的問題。比如乙個鍊錶是這樣的 1 2 3 4 5 通過反轉後成為5 4 3 2 1。最容易想到的方法遍歷一遍鍊錶,利用乙個輔助指標,儲存遍歷過程中當前指標指向的下乙個元素,然後將當前節點元素的指標反轉後,利用已經儲存的指標往後面繼續遍歷。源...

網路程式設計筆試題

1.iso osi的七層模型是什麼?tcp udp是屬於哪一層?tcp udp有何優缺點?答 分為下面7層 應用層,表示層,會話層,運輸層,網路層,物理鏈路層,物理層 tcp udp屬於運輸層 tcp 服務提供了資料流傳輸 可靠性 有效流控制 全雙工操作和多路復用技術等。與 tcp 不同,udp並不...

程式設計基礎筆試題

1.在c 中,類的靜態成員 static member 必須在類內宣告,在類外初始化 class a int a count 0 類外初始化,不必再加static關鍵字2.對於 char p new char 100 p為指標,指向空間,在棧上,new是動態記憶體分配,new出來的空間在堆上,在堆上...