立體推箱子是乙個風靡世界的小遊戲。
遊戲地圖是乙個n行m列的矩陣,每個位置可能是硬地(用」.」表示)、易碎地面(用」e」表示)、禁地(用」#」表示)、起點(用」x」表示)或終點(用」o」表示)。
你的任務是操作乙個1×1×2的長方體。
這個長方體在地面上有兩種放置形式,「立」在地面上(1×1的面接觸地面)或者「躺」在地面上(1×2的面接觸地面)。
在每一步操作中,可以按上下左右四個鍵之一。
按下按鍵之後,長方體向對應的方向沿著稜滾動90度。
任意時刻,長方體不能有任何部位接觸禁地,並且不能立在易碎地面上。
字元」x」標識長方體的起始位置,地圖上可能有乙個」x」或者兩個相鄰的」x」。
地圖上唯一的乙個字元」o」標識目標位置。
求把長方體移動到目標位置(即立在」o」上)所需要的最少步數。
在移動過程中,」x」和」o」標識的位置都可以看作是硬地被利用。
輸入格式
輸入包含多組測試用例。
對於每個測試用例,第一行包括兩個整數n和m。
接下來n行用來描述地圖,每行包括m個字元,每個字元表示一塊地面的具體狀態。
當輸入用例n=0,m=0時,表示輸入終止,且該用例無需考慮。
輸出格式
每個用例輸出乙個整數表示所需的最少步數,如果無解則輸出」impossible」。
每個結果佔一行。
資料範圍3≤
n,m≤
500'>3≤n,m≤500
3≤n,m≤500
輸入樣例:
7 7
#######
#..x###
#..##o#
#....e#
#....e#
#.....#
#######
0 0
輸出樣例:10
演算法:bfs
#include #include#include
using
namespace
std;
const
int maxn = 5e2+7
;struct
rec ;
intn, m;
char
map[maxn][maxn];
int step[maxn][maxn][3]; //
儲存步數
int dir[4][2] = ; //
普通方向陣列
//設0是立著,1是橫著,2是豎著,這三種狀態
int next_x[3][4] = , , };
int next_y[3][4] = , , };
int next_lie[3][4] = , , };
struct rec st, ed; //
分別是起點和終點位置
bool valid(int x, int y)
return
true;}
void parse_st_ed()
if(map[i][j] == 'x'
) }
if(map[i][j] == 'x'
) }}}
}bool
check(rec next)
if(map[next.x][next.y] == '#'
)
//判斷當前位置是否可行
if(next.lie == 0 && map[next.x][next.y] != '.'
)
if(next.lie == 1 && map[next.x][next.y + 1] == '#'
)
if(next.lie == 2 && map[next.x + 1][next.y] == '#'
)
return
true;}
intbfs() }}
queue
q; step[st.x][st.y][st.lie] = 0
; q.push(st);
while(!q.empty()) }}
}return -1; //無解}
intmain()
for(int i = 1; i <= n; i++)
}parse_st_ed();
int ans =bfs();
if(ans != -1
) else
}return0;
}
AcWing寒假每日一題 Day17滑雪場設計
農夫約翰的農場上有 n nn 個山丘,每座山的高度都是整數。在冬天,約翰經常在這些山上舉辦滑雪訓練營。不幸的是,從明年開始,國家將實行乙個關於滑雪場的新稅法。如果滑雪場的最高峰與最低峰的高度差大於17,國家就要收稅。為了避免納稅,約翰決定對這些山峰的高度進行修整。已知,增加或減少一座山峰 x xx ...
AcWing 日期問題
小明正在整理一批歷史文獻。這些歷史文獻 現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有採用年 月 日的,有採用月 日 年的,還有採用日 月 年的。更加麻煩的是,年份也都省略了前兩位,使得文獻上的乙個日期,存在很多可能的日...
AcWing 小貓爬山
翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...