Tyvj P1813 [JSOI2008]海战训练

P1813 [JSOI2008]海战训练

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

为了准备高层峰会,元首命令武装部队必须处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了JS-2008飞机。此外,巡洋船只和舰队将被派去保护海岸线。

但不幸的是因为种种原因,海军部仅有很少的几位军官能指挥大型海战。因此,他们考虑培养一些新的海军指挥官,为此选择了“海战”这一游戏来帮助训练。

在这个著名的游戏中,一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。

输入格式

输入文件头一行由用空格隔开的两个整数R和C组成,1<=R,C<=1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也可为“.”,“#”表示船只的一部分,“.”表示水。

输出格式

为每一个段落输出一行解。如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个“#”号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出一段话“There are S ships.”,S表示船只的数量。否则输出“Bad placement.”。

测试样例1

输入

6 8 
.....#.# 
##.....# 
##.....# 
.......# 
#......# 
#..#...#

输出

There are 5 ships.

备注

JSOI2008江苏省青少年信息学奥林匹克代表队组队选拔赛第二轮试题

题解:昨天刚刚学的悬线法求矩形居然今天就用到了——这个题里面需要求出每个点的左侧、右侧、上方、下方各有多少个“1”点(本程序中包含自己),然后接下来的任务就是判断矩形,我的做法如下——在表格中枚举每个左侧、上方均为0但是自身为1的点(一般也就是矩形的左上角),然后从此点一直向下,检测此点的左侧是否一直只有自己1个点,右侧宽度是否一直一致;然后从此点再向右扫,看上方是否一直只有自己1个点,下方高度是否保持一致。假如出现问题则说明出现了黏在一起的多个矩形,则Bad placement.(HansBug:则OrzPhile嘿嘿嘿。。。 Phile:TT);假如一切正常则正方形数+1,然后继续。。。(特别提醒:输出时别忘了格式是There are X ships.)

 1 var
 2    i,j,k,l,m,n,tt:longint;
 3    a,b,dow,up,lef,rig:array[0..1050,0..1050] of longint;
 4    c1:char;
 5 procedure OrzPhile;
 6           begin
 7                writeln(‘Bad placement.‘);
 8                halt;
 9           end;
10 begin
11      readln(n,m);
12      for i:=1 to n do
13          begin
14               for j:=1 to m do
15                   begin
16                        read(c1);
17                        case c1 of
18                             ‘.‘:a[i,j]:=0;
19                             else a[i,j]:=1;
20                        end;
21                   end;
22               readln;
23          end;
24      fillchar(b,sizeof(b),0);
25      fillchar(dow,sizeof(dow),0);
26      fillchar(rig,sizeof(rig),0);
27      fillchar(lef,sizeof(lef),0);
28      for i:=1 to n do
29          for j:=1 to m do
30              begin
31                   if a[i,j]=1 then lef[i,j]:=lef[i,j-1]+1 else lef[i,j]:=0;
32                   if a[i,j]=1 then up[i,j]:=up[i-1,j]+1 else up[i,j]:=0;
33              end;
34      for i:=n downto 1 do
35          for j:=m downto 1 do
36              begin
37                   if a[i,j]=1 then rig[i,j]:=rig[i,j+1]+1 else rig[i,j]:=0;
38                   if a[i,j]=1 then dow[i,j]:=dow[i+1,j]+1 else dow[i,j]:=0;
39              end;
40      tt:=0;
41      for i:=1 to n do
42          for j:=1 to m do
43              if (a[i,j]=1) and (a[i-1,j]=0) and (a[i,j-1]=0) then
44                 begin
45                      for k:=1 to dow[i,j] do
46                          begin
47                               if lef[i+k-1,j]>1 then OrzPhile;
48                               if rig[i+k-1,j]<>rig[i,j] then OrzPhile;
49                          end;
50                      for k:=1 to rig[i,j] do
51                          begin
52                               if up[i,j+k-1]>1 then OrzPhile;
53                               if dow[i,j+k-1]<>dow[i,j] then OrzPhile;
54                          end;
55                      inc(tt);
56                 end;
57      writeln(‘There are ‘,tt,‘ ships.‘);
58 end.
59                   
时间: 2024-10-14 20:54:39

Tyvj P1813 [JSOI2008]海战训练的相关文章

[JSOI2008][TYVJ P1824] 星球大战

描述 很久以前,在一个遥远的银河系……对反抗军来说,这是一个黑暗的时刻.虽然帝国军的终极武器“死亡星球”已经被摧毁,帝国的军队仍然把反抗军从隐藏的军事基地中赶出,并在整个银河系展开追逐. 考虑到邪恶的帝国完全有能力在短时间内制造出“死亡星球”的替代品,为了避免被一次全部歼灭,反抗军的指挥官决定把部队分散在很多星球上.可是,这样会带来通讯上的问题.某些星球之间可以通过“以太”隧道直接通讯,而没有隧道相连的星球之间的通讯就需要其他星球帮忙转发.因此,只有两个星球之间存在一条由“以太”隧道拼接成的路径

JSOI2008 火星人prefix

1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2918  Solved: 866[Submit][Status] Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 11 字符 m a d a m i m a d a m 现在,火星人

P1003 越野跑【tyvj】

/*=========================================================== P1003 越野跑 描述 Description 为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练 .贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定: 奶牛独自进山的时间不得超过M秒(1 <= M <= 10,000,000). 整条山路被贝茜划分成T个长度相同的小段(1 <= T <= 100,000),并且, 贝茜用S_

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

java软件系统功能设计实战训练视频教程

http://pan.baidu.com/s/1o8zAxw2 java软件系统功能设计实战训练视频教程+资料+源码 ------------------------------------------------------------------- 01:整体课程介绍和杂项介绍.mp4 02:软件功能设计常见理念和方法.mp4 03:关于软件设计的一些思考.mp4 04:第一周作业的业务和相应模式:综合应用简单工厂模式.代理模式.中介者模式.mp4 05:第一周设计作业的基础概要代码.mp4

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列

BZOJ1015[JSOI2008]星球大战starwar[并查集]

1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5253  Solved: 2395[Submit][Status][Discuss] Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直接或间接地连接. 但好景不长,很快帝国又重

BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计数有一个什么什么算法... 我真的企图研究了...但是智商捉急的我实在看不懂论文... 所以最后还是写了暴力... 当然暴力也要靠正确的姿势的. 首先来看一个结论: 同一张图的所有最小生成树中,边权值相同的边的数目是一定的. 也就是说,假如某一张图的某一棵最小生成树由边权值为1,1,2,2,2,3的

TYVJ 2049 魔法珠 sg函数

题意:链接 方法:sg函数 解析: tyvj的题大部分都没题解啊- - 不过这样貌似会更好?感觉做这的题都需要自己动脑啊- - 虽然嘴上说着好烦然而心里觉得好评? 回归正题 设sg[x]表示数x的sg值,这好像是废话 然后对于读入的a[i],将所有的a[i]的sg值异或起来如果不是零则先手赢反之后手 维护的时候有个坑. 每次求约数的时候,数组要在sg里开,因为如果递归下去的话,全局变量的话会被更改,会被坑死. 然后就是怎么维护了 对于x,先求约数 之后枚举哪个数不取,将其他的异或(或者先都异或起