P1331 海战 (深搜)

题目背景

在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了 F-2003 飞机。

此外,巡洋船只和舰队将被派去保护海岸线。不幸的是,因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们培养了一些新海军指挥官。军官们选择了“海战”游戏来帮助他们学习。

题目描述

在一个方形的盘上,放置了固定数量和形状的船只,每只船却不能碰到其它的船。在本题中,我们认为船是方形的,所有的船只都是由图形组成的方形。

求出该棋盘上放置的船只的总数。

输入格式

第一行为两个整数 R 和 C,用空格隔开,分别表示游戏棋盘的行数和列数。

接下来 R 行,每行 C 个字符,为 # 或 .# 表示船只的一部分,. 表示水。

输出格式

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

输入输出样例

输入 

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

输出 

There are 5 ships.

说明/提示

对于 100% 的数据,1≤R,C≤1000。


思路: 

此题本人也是读了好几遍和看样例才明白,根据题目要求,要求不能有船挨着和要求船是方

形组成的(这里的方形包括1*1的方形), 在2*2的方形中,下面这四种情况肯定是不满足的

# # 
. #
或
# #
# .
或
# .
# #
或
. #
# #

 所以这里就有一个方形 判断技巧如下:

此技巧记下来就好

//判断矩阵是不是方形小技巧 ,这里记下来就好 
bool check(int x,int y)
{int cnt = 0;if(g[x][y] == '#') cnt++;if(g[x+1][y] == '#') cnt++;if(g[x][y+1] == '#') cnt++;if(g[x+1][y+1] == '#') cnt++;if(cnt == 3) return false;return true;	
}

通过上面判断,接下来如果上面是true,那么此图就是合法的图,我们通过找最大连通块去找船即可


AC代码:

#include<iostream>
#include<cstring>using namespace std;const int N = 1010;
char g[N][N];
int r,c;//深搜去找多少个 
void dfs(int x,int y)
{g[x][y] = '.';//找到'#',使其变成'.'//该点上下左右坐标偏移量 int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};for(int i=0;i<4;i++){int a  = x + dx[i],b = y + dy[i];//满足情况就接着搜 if(a >= 1 && a<=r && b >= 1 && b<=c && g[a][b] == '#'){dfs(a,b);}}return;
} //判断矩阵是不是方形小技巧 ,这里记下来就好 
bool check(int x,int y)
{int cnt = 0;if(g[x][y] == '#') cnt++;if(g[x+1][y] == '#') cnt++;if(g[x][y+1] == '#') cnt++;if(g[x+1][y+1] == '#') cnt++;if(cnt == 3) return false;return true;	
}int main()
{cin >> r >> c;for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){cin >> g[i][j];}}for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){//不合法后面就不用找船的个数了 if(check(i,j) == false){printf("Bad placement.");return 0;}}}int ans = 0;for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){if(g[i][j] == '#'){ans++;dfs(i,j);	} }}printf("There are %d ships.",ans);return 0;	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置Chrome打开链接在新标签页显示

Chrome版本 版本 123.0.6312.106&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 下面这两个页面都有设置按钮&#xff1a; https://www.google.com/?pli1或者https://www.google.com/?hlzh-CN 要先退出账号&#xff0c;要不然看不到右下角的 “设置” 。…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

内部类(InnerClass) 总结

类的成员之五&#xff1a;内部类1. 什么是内部类&#xff1f; 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff08;InnerClass&#xff09;&#xff0c;类B则称为外部类&#xff08;OuterClass&#xff09;。 内部只供外部类使用 2. 为什么需要内部…

富格林:正规思路实现得益出金

富格林悉知&#xff0c;随着金融市场的不断发展&#xff0c;黄金作为一种正规投资品种被越来越多投资者认识&#xff0c;在黄金投资市场中&#xff0c;有各种各样复杂的信息&#xff0c;投资者要懂得明辨是非&#xff0c;树立正规做单思路避免受害亏损。以下也为大家总结几点正…

STM32为什么不能跑Linux?

STM32是一系列基于ARM Cortex-M微控制器的产品&#xff0c;它们主要用于嵌入式系统中。而Linux则是一个开源的类Unix操作系统&#xff0c;主要面向的是桌面电脑、服务器等资源丰富的计算机。虽然理论上可以将Linux移植到STM32上运行&#xff0c;但是由于两者之间存在着很多技术…

vivado 配置存储器器件编程2

为双 QSPI (x8) 器件创建配置存储器文件 您可使用 write_cfgmem Tcl 命令来为双 QSPI (x8) 器件生成 .mcs 镜像。此命令会将配置数据自动拆分为 2 个独立 的 .mcs 文件。 注释 &#xff1a; 为 SPIx8 生成 .mcs 时指定的大小即为这 2 个四通道闪存器件的总大小。…

QA测试开发工程师面试题满分问答5: 内存溢出和内存泄漏问题

概念阐述 内存溢出&#xff08;Memory Overflow&#xff09;和内存泄漏&#xff08;Memory Leak&#xff09;是与计算机程序中的内存管理相关的问题&#xff0c;它们描述了不同的情况。 内存溢出是指程序在申请内存时&#xff0c;要求的内存超出了系统所能提供的可用内存资源…

SSM框架学习——Eclipse创建Spring MVC maven项目

Spring MVC项目创建 什么是Spring MVC Spring MVC是Spring内置的&#xff0c;实现了Web MVC设计模式的框架。 它解决了Web开发过程中很多的问题&#xff0c;例如参数接收、表单验证等。另外它采用松散耦合可插拔组件等结构&#xff0c;具有相对较高的灵活性和扩展性。 Spri…

vue创建项目下载动态路由v-for mounted websocket :style :class store使用说明

在Vue中创建一个项目&#xff0c;并整合动态路由、v-for、mounted生命周期钩子、WebSocket、:style、:class以及Vuex的store&#xff0c;涉及到多个Vue核心特性的使用。下面我将简要说明如何逐步整合这些特性。 1. 创建Vue项目 使用Vue CLI创建项目&#xff1a; 2. 配置动态路…

html怎么实现axios发请求,并且实现跨域

方案是代理服务器 前端处理 一、下包 save是开发环境的意思 可以单独弄个server文件夹或者其他也行 npm install express --savenpm install http-proxy-middleware --save二、准备proxy-server.js文件 const express = require(express) const {createProxyMiddleware } = r…

C++ 类(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

【计算机网络】epoll

IO多路转接 - epoll 一、I/O多路转接之 epoll1. epoll 接口&#xff08;1&#xff09;epoll_create()&#xff08;2&#xff09;epoll_wait()&#xff08;3&#xff09;epoll_ctl() 2. epoll 原理3. epoll 的优点4. epoll 的使用5. epoll 的工作模式&#xff08;1&#xff09;水…

实验四 Java图形界面与事件处理(头歌)

实验四 Java图形界面与事件处理(头歌) 制作不易&#xff01;点个关注&#xff01;给大家带来更多的价值&#xff01; 目录 实验四 Java图形界面与事件处理(头歌) 制作不易&#xff01;点个关注&#xff01;给大家带来更多的价值&#xff01;代码如下&#xff1a; 代码如下&…

platformio创建项目卡死问题(ctl解决)

vscode上安装完platformio后&#xff0c;创建一个新项目&#xff0c;始终在转圈&#xff0c;查阅官网文档后发现可以使用ctl在终端中创建项目&#xff0c;本文方案的前提是终端走了代理。 根据官网命令安装ctl&#xff1a; curl -fsSL -o get-platformio.py https://raw.gith…

case语句

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 CASE 语句的执行方式与 IF...THEN...ELSIF 语句的执行方式类似&#xff0c;但是它是通过一个表达式的值来决定执行哪个分支 CASE 选择器表达式 WHEN 条件 1 THEN 语句序列 …

2024.03.23校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 元戎启行 2024春招&#xff08;内推&#xff09; 校招 | 元戎启行 2024春招&#xff08;内推&#xff09; 2、校招 | 博雅工道机器人 2024春季校园招聘开始了&#xff01; 校招…

内网穿透实践

一、使用介绍 由于绝大部份人的网络都是处在内网之中&#xff0c;这导致你在本地电脑上写的一些web服务器&#xff08;又或者其它网络相关的功能&#xff09;&#xff0c;都是无法将链接发给别人使用查看的。 并且由于大部分人采用的方案也都是在本地进行测试开发&#xff0c…

dotnet依赖注入与IOC(包含Autofac的使用)

文章目录 依赖注入与IOCIOC依赖注入DIAutofac轻量容器的使用 依赖注入与IOC IOC IOC 是 Inversion of Control&#xff08;控制反转&#xff09;的缩写。在软件开发中&#xff0c;IOC 是一种设计模式&#xff0c;它改变了传统的程序设计流程&#xff0c;使得对象之间的依赖关系…

redis数据结构基础介绍

Redis 是一种开源的、内存中的数据结构服务器&#xff0c;它支持多种类型的数据结构。以下是 Redis 支持的主要数据结构&#xff1a; 字符串&#xff08;String&#xff09;&#xff1a; 这是最简单的类型&#xff0c;一个键对应一个值&#xff0c;是二进制安全的。这意味着 Re…

Linux: linux常见操作指令

目录 01.ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09; 07.man指令&#xff08;重要&#xff09; 07.cp指令&#xff08;重要&#xff09; 08.mv指令&#…