小強有一天想去郊區玩,但是路上會經過一片山路,山路可以看成是乙個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出來的空間在堆上,在堆上...