codevs1911 孤島營救問題

2021-07-24 04:17:39 字數 1891 閱讀 7244

1944 年,特種兵麥克接到國防部的命令,要求立即趕赴太平洋上的乙個孤島,營救被敵軍俘虜的大兵瑞恩。瑞恩被關押在乙個迷宮裡,迷宮地形複雜,但幸好麥克得到了迷宮的地形圖。迷宮的外形是乙個長方形,其南北方向被劃分為n 行,東西方向被劃分為m列,

於是整個迷宮被劃分為n×m 個單元。每乙個單元的位置可用乙個有序數對(單元的行號,單元的列號)來表示。南北或東西方向相鄰的2 個單元之間可能互通,也可能有一扇鎖著的門,或者是一堵不可逾越的牆。迷宮中有一些單元存放著鑰匙,並且所有的門被分成p類,開啟同一類的門的鑰匙相同,不同類門的鑰匙不同。

大兵瑞恩被關押在迷宮的東南角,即(n,m)單元裡,並已經昏迷。迷宮只有乙個入口,在西北角。也就是說,麥克可以直接進入(1,1)單元。另外,麥克從乙個單元移動到另乙個相鄰單元的時間為1,拿取所在單元的鑰匙的時間以及用鑰匙開門的時間可忽略不計。

«程式設計任務:

試設計乙個演算法,幫助麥克以最快的方式到達瑞恩所在單元,營救大兵瑞恩。

第1行有3個整數,分別表示n,m,p的值。第2 行是1個整數k,表示迷宮中門和牆的總數。第i+2 行(1<=i<=k),有5 個整數,依次為

xi1,yi1,xi2,yi2,gi:

當gi>=1時,表示(xi1,yi1)單元與(xi2,yi2)單元之間有一扇第gi類的門,當gi=0 時,表示(xi1,yi1)單元與(xi2,yi2)單元之間有一堵不可逾越的牆(其中,|xi1-xi2|+|yi1-yi2|=1,

0<=gi<=p)。

第k+3行是乙個整數s,表示迷宮中存放的鑰匙總數。

第k+3+j 行(1<=j<=s),有3個整數,依次為xi1,yi1,qi:表示第j 把鑰匙存放在(xi1,yi1)單元裡,並且第j 把鑰匙是用來開啟第qi類門的。(其中1<=qi<=p)。

輸入資料中同一行各相鄰整數之間用乙個空格分隔。

將麥克營救到大兵瑞恩的最短時間的值輸出。如果問題無解,則輸出-1。

4 4 9

91 2 1 3 2

1 2 2 2 0

2 1 2 2 0

2 1 3 1 0

2 3 3 3 0

2 4 3 4 1

3 2 3 3 0

3 3 4 3 0

4 3 4 4 0

22 1 2

4 2 1

14
有點意思的bfs,特點是門是在房間之間的,開個4維陣列記錄下就好。

**如下

#include

#include

#include

using

namespace

std;

const

int size = 60;

bool use[size][size][1245];

int n,m,p,key[size][size];

intmap[16][16][16][16];

int step[4][2] = ,,,};

struct point

;queue

< point > q;

void get(point &a,int y)

bool check(int i,int j,int x,int y,int k)

return

true;

}bool pd(int i,int j,int x,int y,int k)

int bfs()}}

return -1;

}int main()

int s;

scanf("%d",&s);

for(int i = 1 ; i <= s ; i ++)

printf("%d\n",bfs());

return

0;}

191 煎餅排序

題目描述 給定陣列 a,我們可以對其進行煎餅翻 我們選擇一些正整數 k a.length,然後反轉 a 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉 按順序一次接一次地進行 以完成對陣列 a 的排序。返回能使 a 排序的煎餅翻轉操作所對應的 k 值序列。任何將陣列排序且翻轉次數在 10 a....

LeetCode191 統計詞頻

寫乙個 bash 指令碼以統計乙個文字檔案 words.txt 中每個單詞出現的頻率。為了簡單起見,你可以假設 words.txt只包括小寫字母和 每個單詞只由小寫字母組成。單詞間由乙個或多個空格字元分隔。示例 假設 words.txt 內容如下 dayis sunny the thethe sun...

第191場周賽

class solution return res 這裡有個注意的點,maxh maxw這兩個int的值的乘積會超過int的範圍,所以要先轉換為double class solution maxh maxh h horizontalcuts hcut 1 maxh h horizontalcuts ...