海盜船(corsair)
【問題描述】
有乙個很有趣的遊戲叫做海盜船。這是乙個在9*8的棋盤上進行的遊戲,棋盤上的每個格仔可能是下面4種狀態之一:
「.」:表示當前格仔為空;
「s」:表示你的船所在的位置;
「e」:表示敵船所在的位置;
「#」:表示一座小島。
每次你可以將你的船朝周圍的8個方向之一移動,但不能停留。在你移動完之後,所有的敵船會朝周圍8個位置中和你的船當前位置距離最近的那個格仔移動。在這個過程中,如果某艘敵船碰到了小島,那麼這艘敵船將會沉沒。如果兩艘敵船同時走到同乙個格仔中,那麼這兩艘敵船將會同時沉沒,並且其殘骸將會在該位置形成障礙,也就是說如果還有敵船走到這個位置,那麼該敵船也會沉沒。每艘敵船上都裝了烈性炸藥,如果你不幸讓某艘敵船撞到了你,你就可以和我們敬仰的祖先歡聚一堂了。
現在你的任務是通過移動你的船來消滅所有的敵船,當然,在移動過程中,請確保你的船不要撞倒小島或者敵船的殘骸。
【輸入格式】
輸入檔案第一行包含乙個整數t,表示測試資料組數,以下每組資料報含乙個9*8的地圖,地圖上的符號以及意義如題目所述。相鄰的兩組資料間用乙個空行隔開。
【輸出格式】
輸出檔案對於每組資料輸出一行資訊。如果你能夠消滅所有的海盜船,那麼輸出「i'm the king of the seven seas!」,否則輸出「oh no! i'm a dead man!」。
【輸入樣例】
...e....
...#s...
.......e
.....e..
..e#.#..
....s...
...#.#e.
...e....
【輸出樣例】
i'm the king ofthe seven seas!
oh no! i'm adead man!
分析:本題考查搜尋,深搜廣搜都可以,但對於本題廣搜時間效率高一些,而且本題練習廣搜還是很好地,所以我選擇了廣搜。
讀題後可以發現這個地圖上乙個格仔可能存在5種狀態:「你」的船,敵船,小島,敵船相撞的殘骸和空,出於方便我們可以把敵船,小島,殘骸都歸為敵船,但真正的敵船會動,用乙個布林陣列標為 true,小島和殘骸不能動,標為false。只要你的船碰到這些東西都會掛掉。
對於不動的敵船(小島,殘骸)我們不必考慮,對於可以移動的敵船我們只要根據其座標與你的船的座標的關係即可得出其移動方向:位於你的船左上的船將向右下移動,位於上方的船將向下移動......。
處理了這些大概程式也不難寫出了,將你的船座標放入佇列中,對於隊首元素列舉與其相鄰的八個點,如果該點沒有敵船,且你的船在該點不會被迎面而來的敵船撞死,則記錄狀態,入隊。如果能夠消滅敵船則結束。
程式(好吧寫的很亂):
program corsair;
var px:array[1..8]of longint=(0,0,1,1,1,-1,-1,-1);
py:array[1..8]of longint=(1,-1,0,1,-1,1,0,-1);
dx,dy:array[0..200000]of longint;
r:array[0..200000,1..72,1..2]of longint;
v:array[0..200000,1..72]of boolean;
n,nx:longint;
i,m,j,l,h,t,x,y,xx,yy,g,k,u:longint;
c:char;
s:string;
function ffa(x,y:longint):boolean;//由於是你的船先走,所以要判斷出會不會自己撞到敵船
var i:longint;
begin
ffa:=true;
for i:=1 to m do
if (r[h,i,1]=x)and(r[h,i,2]=y) then begin ffa:=false; break; end;
end;
procedure ppa;//處理敵船的移動,判斷敵船是否撞到你,並且要判斷出哪些敵船同其他敵船相撞或撞到小島,若撞到,則兩者都標為false
var i,j,x,y:longint;
begin g:=0;
for i:=1 to m do
if v[t,i]=true then
begin
x:=r[h,i,1]; y:=r[h,i,2];
if (xdx[t])and(ydy[t]) then begin r[t,i,1]:=x+1; r[t,i,2]:=y-1; end;
if (x>dx[t])and(y>dy[t]) then begin r[t,i,1]:=x-1; r[t,i,2]:=y-1;end;
if (x=dx[t])and(ydy[t]) then begin r[t,i,1]:=x; r[t,i,2]:=y-1;end;
if (x>dx[t])and(y=dy[t]) then begin r[t,i,1]:=x-1; r[t,i,2]:=y; end;
if (x0)and(xx<=9)and(yy>0)and(yy<=8)and(ffa(xx,yy)=true) then
begin
t:=t+1; dx[t]:=xx; dy[t]:=yy; r[t]:=r[h]; v[t]:=v[h]; g:=0; m:=u;//不知為何m在迴圈幾次後變為0,只好中途在重新賦值
ppa; if g=1 then t:=t-1 else if g=2 then
begin
writeln('i''','m the king of the seven seas!');
k:=1; break;
end;
end;
end;
if k=1 then break; if t>199000 then break;//防止超出陣列邊界
end; n:=nx; readln;//每組資料注意要換行
if k=0 then writeln('oh no! i''','m a dead man!');//注意要輸出單引號,再加乙個單引號
end;
close(input); close(output);
end.
貪心 加勒比海盜船 最優裝載問題
在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這正是傳說中海盜最活躍的加勒比海。17 世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎...
加勒比海盜船 最優裝載問題 貪心演算法
在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這,正式傳說中海盜最活躍的加勒比海 caribbean sea 17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜們不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,...
貪心演算法 加勒比海盜船 最優裝載問題
在北美洲南部,有一篇神秘的海域,那裡碧海藍天 陽光明媚。這正是傳說中海盜最活躍的加勒比海。17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失...