**:
題意:
在h * w的地圖上有n個乳酪工廠,每個工廠分別生產硬度為1-n的乳酪。有乙隻老鼠準備從出發點吃遍每乙個工廠的乳酪。老鼠有乙個體力值,初始時為1,每吃乙個工廠的乳酪體力值增加1(每個工廠只能吃一次),且老鼠只能吃硬度不大於當前體力值的乳酪。
老鼠從當前格到上下左右相鄰的無障礙物的格需要時間1單位,有障礙物的格不能走。走到工廠上時即可吃到該工廠的乳酪,吃乳酪時間不計。問吃遍所有乳酪最少用時。
輸入:第一行三個整數h(1 <= h <= 1000)、w(1 <= w <=1000)、n(1 <= n <= 9),之後h行w列為地圖, 「.「為空地, 」x「為障礙物,」s「為老鼠洞, 1-n代表硬度為1-n的乳酪的工廠。輸出最少用時。
題意翻譯參考自
因為給出的數字是連續的,初始的值是1,只能吃比自己體力小的乳酪,到達乳酪時可以選擇吃或者不吃,所以每個位置可能經過多次,不能簡單的標記,這樣考慮:
因為題目限制,那麼必定吃的數字的順序是1 2 3 ...依次遞增,那麼就把這個總的任務分解成從 0(開始)到1,從1到2...分別
求最短路徑的情況,單獨處理每一段,最後累加所有的最短時間,肯定是最優解了。
測試資料:
4 5 2
.x..1
....x
.xx.s
.2.x.
3 3 1
s.....
..110 10 9
.x...x.s.x
6..5x..x1x
...***x..x
x..9x...x.
8.x2x..x3x
...xx.x4..
xx....7x..
x..x..xx..
x...x.xx..
..x.......
ac**:
#include#include#includeusing namespace std;
const int maxn=1005;
int n,m,k,dx=,dy=,vis[maxn][maxn];
char map[maxn][maxn];
struct maze
;maze bfs(int bx,int by,char ch)
; q.push(st);vis[bx][by]=1;
while(!q.empty())
for(int i=0;i<4;++i)
maze tp=;
if(!vis[tx][ty])
} }}
int main()
{ //freopen("shuju.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&k))
{ int bx,by;
for(int i=0;i
AOJ 綜合訓練 2016 11 24
題意分析 分別讀入10個數,按照他給出的格式輸出就行了。注意每有7個字元 包括空格 include int main 題意分析 給出n個數,公升序排序,然後輸出最大的2個就行了。注意氣泡排序寫法。外層迴圈n 1次,記憶體迴圈n i 1次。include define max 10001 int a ...
AOJ 綜合訓練 2016 12 1
題意分析 根據公式,先用含有n的代數式表示出來pi,然後計算這個近似值和題目給出來的3.14159165作差求絕對值,當差值大於1e 5的時候繼續計算,否則就跳出迴圈輸出。有幾點需要注意的,首先做除法預算的時候 題目中的n 要為double型別,如果為int型別的話最後結果為0。還有注意題目中的初始...
插入排序(aoj)
像打撲克牌那樣 對於未排序資料 右手抓到的牌 在已經排序序列 左手已經排好序的手牌 中從後向前掃瞄,找到相應的位置並插入。演算法描述 1.從第乙個元素開始,該元素可以認為已經被排序 2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 3.如果該元素 已排序 大於新元素,將該元素移到下一位置 4....