FZUOJ 2250 不可能彈幕結界 BFS

2021-09-30 13:48:03 字數 2491 閱讀 5836

咲夜需要穿過一片彈幕區,由於咲夜發動了符卡「theworld」,所以彈幕是靜止的。這片彈幕區以乙個n*m的矩陣的形式給出。

『.』表示這個位置是安全的,』x』表示這個位置上是有子彈的,禁止通行。咲夜每次能向左、右、下三個方向的相鄰格仔走,但是不能向上走。 同時由於時間有限,咲夜在進入每一行之後最多只能橫向走k步。你可以簡單地認為我們的目標就是從第0行走到第n+1行,起點和終點可以是在第0行和第n+1行的任意位置,當然第0行和第n+1行都是沒有彈幕的。

然而這是號稱不可能的彈幕結界,所以咲夜很可能無法穿過這片彈幕,所以咲夜準備了乙個只能使用一次的技能,縱向穿越,她可以從任意位置直接穿越到另外任意一行的同乙個位置(所在列不變),當然她只能向下穿越,不能向上穿越。穿越的距離越遠,耗費的資源自然越多,所以她想知道最短的穿越距離,才能使她成功通過這片彈幕區。

輸入包含多組資料。

對於每組資料:

第一行輸入三個整數n,m,k,如上所述。

接下下輸入乙個n×m的矩陣,』.』表示當前這格沒有子彈,是安全的,』x』表示這各有子彈,禁止通行。

n<=1000,k<=m<=1000

對於每組資料輸出乙個整數,表示最短的穿越距離。

6 5 2

x.x..

..xx.

.***.

xx.xx

xx..x

..x.x

4 4 1

.***

.***

...x

xx.x3

2對於第一組樣例,最優解是從第一行第二列走到第三行第一列,然後跳到第6行第一列,穿越距離為(6 – 3) = 3。

【思路】由於限制條件有橫向步數,所以我們要維護從起點到某乙個點的最小橫向步數,用vis[i][j]=x來表示從起點能否走到這個點,如果能走到,則走到這個點時的最小橫向步數為x,否則為inf。

因為只能穿越一次,所以穿越前後的兩個點必須分別與起點和終點可達,所以我們考慮分別從起點和終點開始進行兩次bfs,得到vis1陣列和vis2陣列。然後根據穿越是在同一列的性質,對每一列算出它從起點最下能到達的位置和從終點最上能到達的位置。設為maxdown,maxup(初始值為-1)。

下面考慮幾種情況:

1.  起點直接能到終點,顯然為0.

4 4 2

.***

.***

...x

xx.x

2.  只考慮向下的

如上圖,顯然最小為2(maxdown=2,4-2=2)

3. 只考慮向上的

如上圖,顯然最小為3(maxup=2,2+1=3)

可能有疑問,為什麼要這樣取處理這兩種情況呢,又不一定是最優的,其實主要是為了把有-1的情況刪去方便後面的討論。

4.  maxdown==maxup (千萬不要認為是0!!!)

4 4 1  (即題目第二個樣例)

.***

.***

...x

xx.x

顯然往下走到(2,2)已經不能往右走了,往上走到(2,2)也已經不能往左走了,這樣的話結果就包含在上面的2和3裡了,直接continue.

5.  剩下的情況

6 5 2

x.x..

..xx.

.***.

x..xx

xx..x

.x.xx

如圖,第二列maxdown=1,maxup=3,故結果為maxup-maxdown,這時候就不用考慮會發生4這種情況了,因為是直接穿越的。

可能寫得很不清楚,但多畫畫幾種情況應該會慢慢理解的。。。

#include #include #include #include #include #include using namespace std;

#define mst(a,b) memset((a),(b),sizeof(a))

#define rush() int t;scanf("%d",&t);while(t--)

typedef long long ll;

const int maxn=1005;

const int mod = 20090717;

const int inf = 0x3f3f3f3f;

const double eps = 1e-6;

int n,m,k;

int vis1[maxn][maxn];

int vis2[maxn][maxn];

char mp[maxn][maxn];

const int dir1[3][2]=,,};

const int dir2[3][2]=,,};

struct node

now,nex;

bool inbound(node a)}}

}}void bfs2()}}

}}int main()

{ while(~scanf("%d%d%d",&n,&m,&k))

{for(int i=0;i

不是不可能的

今天在網上看到了四川的災情,已經有5萬5千多人遇難了,真的很難過,也真的很震撼,心理 突然萌生一種思想,我能為災區做什麼,我能做什麼,捐錢,我能捐多少啊,捐血我又能捐多 少啊,我是上帝的女兒,我能拯救這世人嗎,我能嗎,上帝已經給了我這責任,給了我,自從 上帝打算揀選我那天開始,我必須要做好,我要先從...

不可能解開的謎題

該書的這一版次是英文版原版 帶原版頁碼 由學鏞 在這裡在這裡 與我合寫的點評,點評是中文。我主要評點內容細節,也就是各章內插入的只言片語,以及後來補寫的第 七 八兩章的全章點評。以前做過 大道至簡 的點評版,深知排版可能給閱讀過程帶來的困擾。而該書在 點評 的排版設計上確實很花了些功夫,其效果遠超我...

去中間商,不可能。

沒有中間商賺差價 這應該是許多消費者和很大一部分廠家,迫切期望的事情。所以市面上有廠家直銷,工廠直供,c2m,f2c等名詞層出不窮,終歸來說,就想去掉中間商,讓利給消費者。說實話,對於消費者來說肯定是很喜愛的,畢竟自己花少錢,買好貨。但對於廠家 品牌方 平台等機構來說,沒有中間商賺差價,是極其危險的...