第四題(50分)(每個測試資料2分)
提交檔案:game.exe
輸入檔案:game.in
輸出檔案:game.out
題目描述:
下面介紹乙個小遊戲:
在乙個m×n的板上,有部分格仔被標記為障礙(例如上圖黑色標示的格仔)。你任選乙個空白格仔放置乙個小球(如上圖灰點所示),並選擇小球滾動的方向(上,下,左,右),小球將在板上一直滾動直至它碰到障礙,或板的邊界,或它之前經過的格仔。如果小球遇到以上情況之一將停下,你可以給它另選滾動的方向,然後小球將以同樣的方式前進。如果小球在四個方向上都無法繼續滾動,遊戲結束,這時假如小球的軌跡覆蓋板上所有的空白格仔,你將獲勝。上圖展示的軌跡就是乙個僅用10步獲勝的例子。
你的任務是對給定板子,計算贏得遊戲所需的最少步數。
輸入格式(map.in):
輸入的第一行是用空格分隔的兩個正整數m和n(m,n<=30),分別板子的高和寬。接下來的m行,每行有n個字元,含義如下:
『.』:該格是空白格仔;
『*』:該格被標記為障礙。
我們保證板子不會全部被標記為障礙。
輸出格式(map.out):
輸出僅乙個整數,表示計算贏得遊戲所需的最少步數。假如無法取勝,則輸出-1。
樣例
game.in
game.out
5 5
題解:從每個可走的點搜尋。剪枝:如果當前走的步數大於之前找到的答案最小值可以直接結束這個點
const
maxn=40;
fx:array[1..4,1..2]of longint=((-1,0),(1,0),(0,-1),(0,1));
inf='game.in';
ouf='game.out';
var a:array[0..maxn+1,0..maxn+1]of boolean;
n,m,i,j,ans,sum:longint;
procedure init;
var i,j:longint;
ch:char;
begin
readln(m,n);
fillchar(a,sizeof(a),true);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(ch);
if ch='*' then
begin
inc(sum);
a[i,j]:=false;
end;
end;
readln;
end;
fillchar(a[0],sizeof(a[0]),false);
fillchar(a[m+1],sizeof(a[m+1]),false);
for i:=1 to m do
begin
a[i,0]:=false;
a[i,n+1]:=false;
end;
ans:=maxlongint;
end;
procedure dfs(dep,x,y,tot:longint);
var i,px,py:longint;
begin
if dep>=ans then exit;
if tot=n*m-sum then
begin
if depx)or(py<>y)then
begin
dfs(dep+1,px,py,tot+abs(px-x)+abs(py-y));
while (x<>px)or(y<>py) do
begin
a[px,py]:=true;
px:=px-fx[i,1];py:=py-fx[i,2];
end;
end;
end;
end;
begin
assign(input,inf);reset(input);
assign(output,ouf);rewrite(output);
init;
for i:=1 to m do
for j:=1 to n do
if a[i,j] then
begin
a[i,j]:=false;
dfs(0,i,j,1);
a[i,j]:=true;
end;
if ans=maxlongint then ans:=-1;
writeln(ans);
close(input);close(output);
end.
測試4T3 圍欄問題
時間限制 2 sec 記憶體限制 128 mb 在一片草原上,有n只兔子無憂無慮地生活著。這片草原可以劃分成m m的方陣。每個方格內最多有乙隻兔子。一位飼養員負責餵養這些兔子。為了方便,她需要用籬笆建造最多k座圍欄,將草原上的兔子全部圍起來。圍欄需要滿足以下條件 1 必須沿著網格線建造 2 每座圍欄...
第5次模擬測試T4題解
hl啊 你的23日遊終於結束了 由於本人實在太懶,才寫了一篇題解 t4.數字遊戲 問題描述 hl中學茶餘飯後喜歡玩遊戲,乙個遊戲規則如下 共兩人參加遊戲,若第乙個人當前手中的數為w1,則下一秒他手上的數將 會變成 x1 w1 y1 mod m 若第二個人當前手中的數為w2,則下一秒他 手上的數將會變...
C 登山(等級考試4級 測試T) 解題思路
五一到了,icpc隊組織大家去登山觀光,隊員們發現山上一共有n個景點,現在告訴你這n個景點的海拔。隊員們決定按照順序來瀏覽這些景點,即每次所瀏覽景點的下標都要大於前乙個瀏覽景點的下標。同時隊員們還有另乙個登山習慣,就是不連續瀏覽海拔相同的兩個景點,並且一旦開始下山,就不再向上走了。隊員們希望在滿足上...