課程練習二 1010 Catch him

2021-07-11 09:58:35 字數 2988 閱讀 3755

problem description

在美式足球中,四分衛負責指揮整隻球隊的進攻戰術和跑位,以及給接球員傳球的任務。四分衛是乙隻球隊進攻組最重要的球員,而且一般身體都相對比較弱小,所以通常球隊會安排5-7名大漢來保護他,其中站在四分衛前方、排成一線的5名球員稱為進攻鋒線,他們通常都是135公斤左右的壯漢。

對防守方來說,攻擊對手的四分衛當然是最直接的限制對手進攻的方法。如果效果好,就可以在對方四分衛傳球之前將其按翻在地,稱之為擒殺。擒殺是最好的鼓舞防守隊士氣的方法,因為對方連傳球的機會都沒有,進攻就結束了,還必須倒退一些距離開球。**的擒殺甚至能夠將對方的四分衛弄傷,從而迫使對方更換這個進攻核心。

在本題中,輸入給出準備擒殺四分衛的防守球員的位置、對方每個進攻鋒線球員的位置以及對方四分衛的位置,你的任務是求出這名準備擒殺的防守球員至少要移動多少步,才能夠擒殺對方四分衛。

假設對方進攻鋒線和四分衛在這個過程中都不會移動。只有1名防守球員,防守球員只要碰到對方四分衛就算擒殺。

所有的球員都是一塊連續的、不中空的2維區域。防守球員不可以從進攻鋒線的身體上穿過,也不可以從界外穿過(只能走空地)。

防守隊員不可以轉動身體,只能平移。防守隊員的身體所有部分向同乙個方向(上、下、左、右)移動1格的過程叫做1步。

input

輸入包含多組資料。每組資料第一行都是兩個整數h,w(0

output

對每組資料,輸出包含擒殺所需最少步數的一行。如果不能擒殺,輸出帶』impossible』的一行。

sample input

6 6

.q....

qq..oo

.oo..o

...o.o

oo.o..

....dd

7 7.q.....

qq.ooo.

...o...

o......

oo..oo.

.o.....

.....dd

0 0

sample output

impossible

9思路:

bfs檢索每個防守球員到4分位的位置,取出最小的。(剛開始理解錯的思路)

實際上這題直接bfs。

感想:這題幹翻譯真他娘的操蛋!什麼身體,亂七八糟的。

就是有幾個d(<20)那麼所有的d都要一起移動,把所有的d看成乙個整體。

剛開始以為只要 存在d可以到達q就 ok呢,(還以為測試資料錯了,這題出的,是出題者翻譯的不行呢?還是我理解能力有問題?)

我已無力吐槽!

剛開始**:(題意理解錯了)

#define _crt_secure_no_warnings

#include#include#include#include#include#includeusing namespace std;

char point[102][102];

int h, w;

bool flag[102][102];

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

struct position

;int bfs(int i,int j)

for (int i = 0; i < 4; i++)

}return 0;

}int main()

int cou[100];

memset(cou, 0, sizeof(cou));

int m = 0;

for (int i = 0; i < h; i++)

for (int j = 0; j < w; j++)

}sort(cou, cou + m);

if (cou[0]!=0)

cout << cou[0] << endl;

else cout << "impossible" << endl;

}freopen("con", "r", stdin);

system("pause");

return 0;

}ac**:(需要將上面**中結構體改一下,用於存放所有的d;對於標記的問題,只需要標記第乙個d的位置

即可(若都標記,則會出錯,自己考慮,不解釋))。

#define _crt_secure_no_warnings

#include#include#include#include#include#includeusing namespace std;

char point[102][102];

int h, w;

bool flag[102][102];

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

struct position

;int bfs(int ax,int ay,int m)

p.ans = 0;

flag[p.x[0]][p.y[0]] = true;

queueq;

q.push(p);

while (!q.empty())

}for (int i = 0; i < 4; i++)

else}}

if (mm == 0)}}

return 0;

}int main()

int cou[100];

memset(cou, 0, sizeof(cou));

memset(flag, false, sizeof(flag));

int m = 0;

int ax[21],ay[21];

for (int i = 0; i < h; i++)

for (int j = 0; j < w; j++)

}int ans = bfs(ax,ay,m);

if (ans!=0)

cout << ans << endl;

else cout << "impossible" << endl;

}freopen("con", "r", stdin);

system("pause");

return 0;

}

課程練習三 1010 Problem J

problem description 有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少種走法?input 輸入資料首先包含乙個整數n,表示測試例項的個數,然後是n行資料,每行包含乙個整數m 1 m 40 表示樓梯的級數。output 對於每個測試例項,請輸出不同...

2016sdau課程練習專題三 1010

1.題目編號 1010 2.簡單題意 乙個人的辦公室用1表示,家用2 表示,從1到2,中間可能會經過其它節點,而該節點可走的原則是 假設他此時在a處,b與其相鄰,只有當b到2 路線中存在一條比a到2 的任意一條路徑都短的路徑,才能走b。問這樣的路線有多少種?3.解題思路 求出各點到2 1的最短距離 ...

2016SDAU課程練習二1002

大體題意 f x 6 x 7 8 x 6 7 x 3 5 x 2 y x 0 x 100 給出y,求x取0 100之間某數時f的最小值。sample input 2 100200 sample output 74.4291 178.8534 解題思路及形成過程 先把y當做常數求導,求導之後的f 0時...