习题:海盗船(广搜)

news/2024/10/25 2:58:03/

海盗船(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!”。

【输入样例】

2

........

........

........

...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;
varpx: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;
beginffa:=true;for i:=1 to m doif (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 doif v[t,i]=true thenbeginx:=r[h,i,1]; y:=r[h,i,2];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(y<dy[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(y>dy[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; r[t,i,2]:=y+1; end;if (x=dx[t])and(y>dy[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 (x<dx[t])and(y=dy[t]) then begin r[t,i,1]:=x+1; r[t,i,2]:=y;end;if (r[t,i,1]=dx[t])and(r[t,i,2]=dy[t]) then begin g:=1; break;end;end;if g=0 then beging:=2;for i:=1 to m-1 dofor j:=i+1 to m doif (r[t,i,1]=r[t,j,1])and(r[t,i,2]=r[t,j,2]) thenbegin v[t,i]:=false; v[t,j]:=false; end;for i:=1 to m doif v[t,i]=true then g:=0;         end;
end;
beginassign(input,'corsair.in');
reset(input);
assign(output,'corsair.out');
rewrite(output);readln(n);for l:=1 to n dobegin      m:=0; k:=0;for i:=1 to 9 do begin readln(s);for j:=1 to 8 dobegin c:=s[j]; if c='S' then begin x:=i; y:=j; end;if c='E' then begin m:=m+1; r[1,m,1]:=i; r[1,m,2]:=j; v[1,m]:=true;end;if c='#' then begin m:=m+1; r[1,m,1]:=i; r[1,m,2]:=j; v[1,m]:=false;end;end;end;    u:=m;h:=0; t:=1; dx[1]:=x; dy[1]:=y;while h<t dobeginh:=h+1;for i:=1 to 8 dobeginxx:=dx[h]+px[i]; yy:=dy[h]+py[i];      m:=u;if (xx>0)and(xx<=9)and(yy>0)and(yy<=8)and(ffa(xx,yy)=true) thenbegint:=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 thenbeginwriteln('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.
View Code


 

转载于:https://www.cnblogs.com/qtyytq/p/4265761.html


http://www.ppmy.cn/news/204075.html

相关文章

【广搜】海盗船

海盗船&#xff08;corsair&#xff09; 【问题描述】 有一个很有趣的游戏叫做海盗船。这是一个在9*8的棋盘上进行的游戏&#xff0c;棋盘上的每个格子可能是下面4种状态之一&#xff1a; “.”&#xff1a;表示当前格子为空&#xff1b; “S”&#xff1a;表示你的船所在的…

技术分享:逆向海盗船k95机械键盘

引文 在几年前我买了一个海盗船 K95 Vengeance机械键盘&#xff0c;键盘有上有背光功能&#xff0c;于是我在考虑是不是可以修改一下。但作者表示购买来的键盘上面没有很多的资料可供利用&#xff0c;需要注意的是&#xff0c;新版的K95与旧版本的K95的CUE不太一样&#xff0c;…

2.2加勒比海盗船 最优装载问题

在北美洲东南部&#xff0c;有一片神秘的海域&#xff0c;那里碧海蓝天、阳光明媚&#xff0c;这正是传说中海盗最活跃的加勒比海&#xff08;Caribbean Sea&#xff09;。17世纪时&#xff0c;这里更是欧洲大陆的商旅舰队到达美洲的必经之地&#xff0c;所以当时的海盗活动非常…

贪心算法之加勒比海盗船最优装载问题

1、问题 在北美洲东南部,有一片神秘的海域,那里碧海蓝天、阳光明媚,这正是传说中海盗最活跃的加勒比海,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活皇家舰......动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国有一天,海盗们截获了一艘装满各种各样古董的货…

海盗船问题

问题描述&#xff1a;ps:原题不是去这样的&#xff0c;差不多是下面这样的 茫茫大海&#xff0c;生活着一群海盗&#xff0c;海盗们整日饮酒作乐悠哉游哉&#xff0c;海盗老大渐渐厌倦&#xff0c;提出要去出海寻找传说中的 one piece,海盗们一致同意出海寻宝&#xff0c;他们有…

h0154.加勒比海盗船——最优装载问题

在北美洲东南部&#xff0c;有一片神秘的海域&#xff0c;那里碧海 蓝天、阳光明媚&#xff0c;这正是传说中海盗最活跃的加勒比 海&#xff08;Caribbean Sea&#xff09;。17 世纪时&#xff0c;这里更是欧洲大陆 的商旅舰队到达美洲的必经之地&#xff0c;所以当时的海盗活 …

1、mysql的安装与配置

下载安装配置 下载zip文件解压之后配置环境变量 在path后面添加mysql bin文件夹的路径&#xff1a;C:\Program Files (x86)\MySQL\bin 配置完环境变量后&#xff0c;在C:\Program Files (x86)\MySQL目录下新建一个配置文件mysql.ini&#xff0c;同时在bin的同级目录C:\Program …

【小沐学Python】Python实现Web服务器(CentOS+Docker下部署Flask)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…