problem description
在美式足球中,四分衛負責指揮整隻球隊的進攻戰術和跑位,以及給接球員傳球的任務。四分衛是乙隻球隊進攻組最重要的球員,而且一般身體都相對比較弱小,所以通常球隊會安排5-7名大漢來保護他,其中站在四分衛前方、排成一線的5名球員稱為進攻鋒線,他們通常都是135公斤左右的壯漢。
對防守方來說,攻擊對手的四分衛當然是最直接的限制對手進攻的方法。如果效果好,就可以在對方四分衛傳球之前將其按翻在地,稱之為擒殺。擒殺是最好的鼓舞防守隊士氣的方法,因為對方連傳球的機會都沒有,進攻就結束了,還必須倒退一些距離開球。**的擒殺甚至能夠將對方的四分衛弄傷,從而迫使對方更換這個進攻核心。
在本題中,輸入給出準備擒殺四分衛的防守球員的位置、對方每個進攻鋒線球員的位置以及對方四分衛的位置,你的任務是求出這名準備擒殺的防守球員至少要移動多少步,才能夠擒殺對方四分衛。
假設對方進攻鋒線和四分衛在這個過程中都不會移動。只有1名防守球員,防守球員只要碰到對方四分衛就算擒殺。
所有的球員都是一塊連續的、不中空的2維區域。防守球員不可以從進攻鋒線的身體上穿過,也不可以從界外穿過(只能走空地)。
防守隊員不可以轉動身體,只能平移。防守隊員的身體所有部分向同乙個方向(上、下、左、右)移動1格的過程叫做1步。
input
輸入包含多組資料。每組資料第一行都是兩個整數h,w(0
output
對每組資料,輸出包含擒殺所需最少步數的一行。如果不能擒殺,輸出帶』impossible』的一行。
sample input
6 6sample output.q....
qq..oo
.oo..o
...o.o
oo.o..
....dd
7 7.q.....
qq.ooo.
...o...
o......
oo..oo.
.o.....
.....dd
0 0
impossible9思路:
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時...