Aoj 0558 Cheese bfs分段處理

2021-07-10 07:11:33 字數 1418 閱讀 4442

**:

題意:

在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....