題目描述:
小m來到了乙個迷宮中,這個迷宮可以用乙個n*m的矩陣表示。在這個迷宮的某些位置中存在金幣。一開始小m在迷宮的入口:矩陣的左上角,位置(1,1)處;迷宮的出口位於矩陣的右下角,位置(n,m)處。每一次小m可以選擇向下或者向右走到乙個相鄰的格仔,但是不能跨出迷宮外。現在小m想收集完迷宮中的所有金幣並最後到達迷宮的出口,請你幫她規劃一條最短的路徑。 輸入
第一行包含三個整數n,m,k,表示矩陣的規模以及金幣的數目。
2≤n,m≤100,0≤k≤1000
接下來k行每行包含兩個整數xi,yi,表示第i個金幣的位置,位於從上往下第xi行,從左往右第yi列。
1≤xi≤n,1≤yi≤m
輸出若不存在滿足條件的路徑,輸出impossible。
若最短路徑存在,則輸出小m移動的序列:
『r』:表示向右;
'd』:表示向下。
若存在多個答案,你需要輸出字典序最小的答案。
樣例輸入
3 3 2
1 23 3
樣例輸出
rddr
思路:首先將金幣按座標進行排序,怎麼排序呢?排序規則是首先按橫座標x從小到大排序,然後如果兩個點的橫座標x相等,則按照縱座標y從
小到大進行排序,排完以後從起始位置依次到達這些金幣的位置,就一定是一條最短的路徑。由於本題只能向下或向右走,故在依次收集金幣的時候需要判斷當前座標x和y是否都不小於前乙個金幣位置的x和y,如果是,則滿足繼續收集,否則,不滿足退出,即不存在一條滿足條件的最短路徑。
如下圖所示:a(1,2)、b(2,2)、c(1,3)、d(3,3)為金幣所在位置,排序以後為a(1,2)、c(1,3)、b(2,2)、d(3,3)。從(1,1)位置開始,依次收集金幣,當收集完金幣c是,此時小m位於(1,3)的位置,由於只能向下或向右移動,故小m無法到達金幣b的位置,因此不存在這樣一條路徑。同理先去收集金幣b,也同樣無法收集金幣c。如果去掉金幣c,則就可以依次收集金幣abd。移動的路徑為rddr。
**實現如下:
#include #include #include #include using namespace std;
struct node
;//自定義排序比較規則
bool compare(node n1, node n2)
sort(arr.begin(), arr.end(), compare);
bool flag = true; //標記是否存在最短路徑
string str;
for (int i = 0; i < k; i++)
else
else }}
if (flag)
else
cout << "impossible" << endl;
return 0;
}
人人網2015研發筆試卷
1.計算機中處理乘法的指令要比加法複雜的多,因為在一些關鍵系統中我們常常會考慮如何盡可能減少乘法的運算。現在有如下的表示式y anxn an 1xn 1 a1x a0,其中an,an 1,a1,a0是常數,給乙個x,要求盡快算出y的值。請嘗試寫出這樣的乙個函式。2.給出二叉樹介面為 class no...
人人網2014筆試演算法題彙總
1.給出乙個有序陣列啊,長度為len,另外給出第三個數x,問是否能在陣列中找到兩個數,這兩個數之和等於第三個數x。我們首先看到第一句話,這個陣列是有序的,所以,我們可以定義兩個指標,乙個指向陣列的第乙個元素,另乙個指向應該指向的位置 這個需要看具體的實現和陣列給定的值 首先計算兩個位置的和是否等於給...
金幣概率問題(威盛筆試題)
題目 10個房間裡放著隨機數量的金幣。每個房間只能進入一次,並只能在乙個房間中拿金幣。乙個人採取如下策略 前四個房間只看不拿。隨後的房間只要看到比前四個房間都多的金幣數,就拿。否則就拿最後乙個房間的金幣。程式設計計算這種策略拿到最多金幣的概率。int genrand int a,int b void...