推箱子是一款經(jīng)典電子游戲,愛麗絲很喜歡玩,但是她有點(diǎn)玩膩了,現(xiàn)在她想設(shè)計(jì)一款拉箱子游戲。
拉箱子游戲需要玩家在一個(gè) N × M 的網(wǎng)格地圖中,控制小人上下左右移動(dòng),將箱子拉到終點(diǎn)以獲得勝利。
現(xiàn)在愛麗絲想知道,在給定地形(即所有墻的位置)的情況下,有多少種不同的可解的初始局面。
【初始局面】 的定義如下:
1、初始局面由排列成 N × M 矩形網(wǎng)格狀的各種元素組成,每個(gè)網(wǎng)格中有且只有一種元素??赡艿脑赜校嚎盏亍?、小人、箱子、終點(diǎn)。
2、初始局面中有且只有一個(gè)小人。
3、初始局面中有且只有一個(gè)箱子。
4、初始局面中有且只有一個(gè)終點(diǎn)。
【可解】 的定義如下:
通過有限次數(shù)的移動(dòng)小人(可以在移動(dòng)的同時(shí)拉箱子),箱子能夠到達(dá)終點(diǎn)所在的網(wǎng)格。
【移動(dòng)】 的定義如下:
在一次移動(dòng)中,小人可以移動(dòng)到相鄰(上、下、左、右四種選項(xiàng))的一個(gè)網(wǎng)格中,前提是滿足以下條件:
1、小人永遠(yuǎn)不能移動(dòng)到 N × M 的網(wǎng)格外部。
2、小人永遠(yuǎn)不能移動(dòng)到墻上或是箱子上。
3、小人可以移動(dòng)到空地或是終點(diǎn)上。
【拉箱子】 的定義如下:
在一次合法移動(dòng)的同時(shí),如果小人初始所在網(wǎng)格沿小人移動(dòng)方向的反方向上的相鄰網(wǎng)格上恰好是箱子,小人可以拉動(dòng)箱子一起移動(dòng),讓箱子移動(dòng)到小人初始所在網(wǎng)格。
即使?jié)M足條件,小人也可以只移動(dòng)而不拉箱子。
第一行兩個(gè)正整數(shù) N 和 M,表示網(wǎng)格的大小。
接下來 N 行,每行 M 個(gè)由空格隔開的整數(shù) 0 或 1 描述給定的地形。其中 1 表示墻,0 表示未知的元素,未知元素可能是小人或箱子或空地或終點(diǎn),但不能是墻。
2 4 0 0 0 0 1 1 1 0
13
13 種可解的初始局面示意圖如下:
人終箱空
墻墻墻空
********
人終空箱
墻墻墻空
********
人空終箱
墻墻墻空
********
箱人終空
墻墻墻空
********
空人終箱
墻墻墻空
********
箱終人空
墻墻墻空
********
空終人箱
墻墻墻空
********
箱終空人
墻墻墻空
********
箱空終人
墻墻墻空
********
空箱終人
墻墻墻空
********
箱終空空
墻墻墻人
********
箱空終空
墻墻墻人
********
空箱終空
墻墻墻人
對(duì)于 30% 的數(shù)據(jù),N, M ≤ 3.
對(duì)于 100% 的數(shù)據(jù),0 < N, M ≤ 10.
第十三屆藍(lán)橋杯大賽軟件賽省賽 Java 大學(xué) B 組 | |
---|---|
C題 | |
D題 | |
E題 | |
F題 | |
G題 | |
H題 | |
I題 | |
J題 |
注意事項(xiàng):
1. 不要使用 package 語(yǔ)句。
2. 選手代碼的主類名必須為:Main,否則會(huì)被判為無效代碼。
3. 如果程序中引用了類庫(kù),在提交時(shí)必須將 import 語(yǔ)句與程序的其他部分同時(shí)提交。
4. 只允許使用 Java 自帶的類庫(kù)。
5. 提交時(shí),注意選擇使用Java語(yǔ)言。
本比賽結(jié)束依舊可以訓(xùn)練,見題集2022年第十三屆藍(lán)橋杯大賽軟件類省賽Java大學(xué)B組真題