#E. Cow Art(bfs经典习题)

news2024/12/25 15:30:34

题目

说明

一个有关奶牛的鲜为人知的事实是她们都是红绿色盲,也就是说,在她们看来,红色和绿色是一样的(译者注:奶牛把这种颜色称作“红绿色”)。这使得我们设计的艺术作品难以同时符合人类和奶牛的审美口味。考虑一个由N x N格字符表示的方形绘画作品,其中每个字符为R(红),G(绿)或者B(蓝)。一幅绘画如果有许多互不相同的着色“区域”,则我们认为它是有趣的。如果两个字符是直接相邻的(一个在另一个的东、南、西、北方向)且其表示的颜色相同,则这两个字符属于同一个区域。例如,下面这幅绘画作品:

RRRBB

GGBBB

BBBRR

BBRRR

RRRRR

如果由人类来看有4个区域(2个红色,1个蓝色和1个绿色区域),而如果由奶牛来看则只有3个区域(2个红绿色,1个蓝色区域)。现给你一副绘画作为输入,请计算该作品由人类和奶牛来看分别有多少个区域。

输入格式

第1行:整数N(N<=100)。

第2..1+N行:每行包含一个长度为N的字符串,表示绘画作品的一行。

输出格式

第1行:两个空格隔开的整数,分别给出由人类和奶牛欣赏绘画作品时会看见多少个区域。

样例

输入数据 1

5

RRRBB

GGBBB

BBBRR

BBRRR

RRRRR

输出数据 1

4 3


思路

做这道题目前建议先做做一本通P1329细胞,因为这题是细胞的举一反三。

主函数逻辑

先设数组visvis[i][j] == 1表示(i,j)位置已经访问过

然后2次搜索连通块数量(第一次是人,第二次是奶牛)

每次都是遍历地图中的每个位置,从每个位置开始进行搜索

遍历网格的过程中,一次成功开始的搜索可以确定一个连通块,统计连通块个数,即为结果。

主函数:

int main()
{
  cin>>n;
  m = n;
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
    {
      cin>>a[i][j];
    }
  }
//以人来看有多少连通块
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < m; j++)
    {
      if(vis[i][j] == 0)//如果该位置没有访问过,那么访问该位置,并bfs。
      {
        colour++;
        bfs(i,j);
      }
    }
  }
  cout<<colour<<' ';
  memset(vis,0,sizeof(vis));//因为后面还有bfs以奶牛来看有多少连通块,所以要初始化
  colour = 0;
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < m; j++)
    {
      if(vis[i][j] == 0)//跟以人来看同理(就是bfs变成了bfs_2)
      {
        colour++;
        bfs_2(i,j);
      }
    }
  }
  cout<<colour;
  return 0;
}

2次bfs函数逻辑

bfs(ren)跟普通bfs差不多,就是判断能不能将现搜到的点加进队列中的条件变了:

nd.x >= 0 && nd.x < n && nd.y >= 0 && nd.y < m 
&& a[nd.x][nd.y] == a[t.x][t.y] && vis[nd.x][nd.y] == 0

也就是判断现在搜到的点是否没有越界,且搜到的点走到搜到的点的点是否相同,且没走过

但是bfs_2(奶牛)的判断条件就又变了一下:

if(nd.x >= 0 && nd.x < n && nd.y >= 0 && nd.y < m && (a[nd.x][nd.y] == a[t.x][t.y] || (a[nd.x][nd.y] == 'R' && a[t.x][t.y] == 'G') || (a[nd.x][nd.y] == 'G' && a[t.x][t.y] == 'R')) && vis[nd.x][nd.y] == 0)

也就是判断现在搜到的点是否没有越界,且(搜到的点走到搜到的点的点是否相同或者这2个点一个R,一个数G(因为奶牛是红绿色盲)),且没走过

2次bfs:

void bfs(int x,int y)
{
  dot t;
  t.x = x;
  t.y = y;
  q.push(t);
  while(!q.empty())
  {
    t = q.front();
    for(int i = 0; i < 4; i++)
    {
      dot nd = t;
      nd.x = nd.x + dx[i];
      nd.y = nd.y + dy[i];
      if(nd.x >= 0 && nd.x < n && nd.y >= 0 && nd.y < m && a[nd.x][nd.y] == a[t.x][t.y] && vis[nd.x][nd.y] == 0)
      {
        q.push(nd);
        vis[nd.x][nd.y] = colour;
      }
    }
    q.pop();
  }
}
void bfs_2(int x,int y)
{
  dot t;
  t.x = x;
  t.y = y;
  q.push(t);
  while(!q.empty())
  {
    t = q.front();
    for(int i = 0; i < 4; i++)
    {
      dot nd = t;
      nd.x = nd.x + dx[i];
      nd.y = nd.y + dy[i];
      if(nd.x >= 0 && nd.x < n && nd.y >= 0 && nd.y < m && (a[nd.x][nd.y] == a[t.x][t.y] || (a[nd.x][nd.y] == 'R' && a[t.x][t.y] == 'G') || (a[nd.x][nd.y] == 'G' && a[t.x][t.y] == 'R')) && vis[nd.x][nd.y] == 0)
      {
        q.push(nd);
        vis[nd.x][nd.y] = colour;
      }
    }
    q.pop();
  }
}

代码

#include <bits/stdc++.h>
using namespace std;
int n,m;//行 列
char a[1000][1000];
int vis[1000][1000];
int dx[4]= {-1,0,1,0},dy[4]= {0,1,0,-1};
int colour;
struct dot
{
  int x,y;
};
queue<dot>q;
void bfs(int x,int y)
{
  dot t;
  t.x = x;
  t.y = y;
  q.push(t);
  while(!q.empty())
  {
    t = q.front();
    for(int i = 0; i < 4; i++)
    {
      dot nd = t;
      nd.x = nd.x + dx[i];
      nd.y = nd.y + dy[i];
      if(nd.x >= 0 && nd.x < n && nd.y >= 0 && nd.y < m && a[nd.x][nd.y] == a[t.x][t.y] && vis[nd.x][nd.y] == 0)
      {
        q.push(nd);
        vis[nd.x][nd.y] = colour;
      }
    }
    q.pop();
  }
}
void bfs_2(int x,int y)
{
  dot t;
  t.x = x;
  t.y = y;
  q.push(t);
  while(!q.empty())
  {
    t = q.front();
    for(int i = 0; i < 4; i++)
    {
      dot nd = t;
      nd.x = nd.x + dx[i];
      nd.y = nd.y + dy[i];
      if(nd.x >= 0 && nd.x < n && nd.y >= 0 && nd.y < m && (a[nd.x][nd.y] == a[t.x][t.y] || (a[nd.x][nd.y] == 'R' && a[t.x][t.y] == 'G') || (a[nd.x][nd.y] == 'G' && a[t.x][t.y] == 'R')) && vis[nd.x][nd.y] == 0)
      {
        q.push(nd);
        vis[nd.x][nd.y] = colour;
      }
    }
    q.pop();
  }
}
int main()
{
  cin>>n;
  m = n;
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
    {
      cin>>a[i][j];
    }
  }
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < m; j++)
    {
      if(vis[i][j] == 0)
      {
        colour++;
        bfs(i,j);
      }
    }
  }
  cout<<colour<<' ';
  memset(vis,0,sizeof(vis));
  colour = 0;
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < m; j++)
    {
      if(vis[i][j] == 0)
      {
        colour++;
        bfs_2(i,j);
      }
    }
  }
  cout<<colour;
  return 0;
}

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

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

相关文章

2.2 标识符与关键字

文章目录1 标识符2 关键字1 标识符 标识符可以简单的理解成一个名字。 在Java中&#xff0c;我们需要给代码中的很多元素起名&#xff0c;包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符&#xff0c;一个正确的标识符需要遵循以下规则&#xff…

【蓝桥杯】简单数论4——丢番图方程

1、二元线性丢番图方程 方程ax by c被称为二元线性丢番图方程&#xff0c;其中a、b、c是已知整数&#xff0c;x、y是变量,问是否有整数解。 ax by c实际上是二维x-y平面上的一条直线&#xff0c;这条直线上如果有整数坐标点&#xff0c;方程就有解&#xff0c;如果没有整数坐…

【算法竞赛 5】动态规划 ——— 闫氏DP分析法(从集合角度来分析DP问题——01背包)

目录 Description 输入格式 输出格式 数据范围 输入样例 输出样例&#xff1a; 题解 状态表示 状态计算 AC_Code 优化后代码 Description 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品…

2.4.1 整数型

文章目录1.整型基本数据类型介绍2.byte 数据类型3.short 数据类型4.int 数据类型5.long 数据类型1.整型基本数据类型介绍 整型用于表示没有小数部分的数字&#xff0c;比如1&#xff0c;2&#xff0c;3等&#xff0c;其允许是负数&#xff0c;JAVA共提供了4种整型数据类型&…

电阻抗成像OpenEIT 番外篇 简单算法

算法意义 C→Y→V→eC\rightarrow Y \rightarrow V \rightarrow eC→Y→V→e 符号 符号含义–Ω\OmegaΩ研究图像区域∂Ω\partial\Omega∂Ω研究图像区域的边界ϕ(x,y)\phi(x,y)ϕ(x,y)代求电导率σ(x,y)\sigma(x,y)σ(x,y)节点电压 e 电导率jn(x,y)j_n(x,y)jn​(x,y)注入表…

C++ 多线程12:内存模型(stdmemory_order)

cpp 多线程&#xff1a;内存模型(std::memory_order) 文章目录cpp 多线程&#xff1a;内存模型(std::memory_order)概念内存模型基础原子操作间的关系Synchronized-withHappens-beforestd::memory_orderRelaxed orderingRelease-Consume orderingRelease-Acquire orderingSeque…

UnityEditor编辑器扩展开发-自定义Shader入门

估计需要自定义Shader 的人不多下面内容就看看作为小白的我们&#xff0c;无从入手&#xff0c;当然首先看看 Amplify Shader Editor(ASE&#xff09;是如何实现Shader定义&#xff0c;从(ASE)的Shader代码&#xff0c;得知自定义原理&#xff08;代码&#xff09;//CustomEdit…

前端艺术之毛玻璃-倾斜-日历

前端艺术之毛玻璃-倾斜-日历描述项目效果index.htmlindex.css描述 项目描述开发语言HTML、JavaScript、CSS库dyCalendarJS、vanilla-tiltEdge108.0.1462.54 (正式版本) (64 位) 该项目中需要使用到的库有&#xff1a; dyCalendarJS vanilla-tilt.js 是 JavaScript 中的一个平…

C++ | 哈希 | 基于开散列结构的unordered系列容器模拟实现

文章目录unordered_map的封装所有接口的声明与实现operator[]重载unordered_set的封装上篇博客模拟实现了哈希的开散列结构&#xff0c;并且将迭代器与泛型进行了封装&#xff0c;至此我们可以将开散列作为底层结构对STL标准容器——unordered_map和unordered_set进行封装。但是…

使用Vue 简化 用户查询/添加功能

使用Vue简化 用户查询/添加功能1. 查询功能1.1 Vue核心对象&#xff1a;1.2 brand.html&#xff1a;1.3 selectAllServlet&#xff08;无变化&#xff09;&#xff1a;2. 添加功能2.1 addBrandhtml&#xff1a;2.2 Vue核心对象&#xff1a;2.3 addServlet&#xff08;无变化&am…

网关zuul源码解析==ZuulServlet

用法&#xff1a; 使用zuul网关&#xff0c;需要引入starter为 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> 同时在springboot启动类上加注解…

7、代码模板的使用

文章目录7、代码模板的使用7.1 查看Postfix Completion模板&#xff08;后缀补全&#xff09;7.2 查看Live Templates模板&#xff08;实时模板&#xff09;7.3 常用代码模板1 非空判断2 遍历数组和集合3 输出语句4 对象操作5 静态常量声明7.4 自定义代码模板1 自定义Postfix C…

Android入门第60天-MVVM中的Databinding与ListView结合使用

开篇 还记得我们进入Listview、GridView都是以一个layoutadapter组合在一起来实现的是吧&#xff1f;那么还记得我们的Adapter的写法么&#xff1f; 在我们的Adapter里提供了一个bindView方法 。 在调用时我们需要在Activity里把layout里的控件元素一个个传给这个Adapter。 在我…

【Linux】文件权限

本期我们来谈谈Linux上的权限&#xff1a;一、权限的概念在生活中我们处处都会遇到权限。权限是什么呢&#xff1f;下面是对于权限的定义&#xff1a;&#x1f4cc;权限&#xff1a;一件事是否允许被“谁”做&#x1f4cc;简化一下就是&#xff1a;权限人事物属性&#x1f4cb;…

【ROS-Navigation】—— Astar路径规划算法解析

文章目录前言1. 导航的相关启动和配置文件1.1 demo01_gazebo.launch1.2 nav06_path.launch1.3 nav04_amcl.launch1.4 nav05_path.launch1.5 move_base_params.yaml1.6 global_planner_params.yaml2. Astar路径规划算法解析2.1 astar.h2.2 astar.cpp参考文献前言 最近在学习ROS的…

《职场求生攻略》学习笔记 Day8

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3《深入浅出计算机组成原理》学习笔记 Day 4《编程高手必学的内存知识》学习笔记 Day 5NUMA内存知…

JavaEE-多线程进阶

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录常见的锁策略乐观锁 vs 悲观锁轻量级锁 vs 重量级锁自旋锁 vs 挂起等待锁互斥锁 vs 读写锁公平锁 vs 非公平锁可重入锁 vs 不可…

恶意代码分析实战 8 恶意代码行为

8.1 Lab 11-01 代码分析 首先使用strings进行分析。 Gina是在 msgina.dll中的。 很多有关资源的函数。 关于注册表的函数。 使用ResourceHacker查看。 发现是一个PE文件。 保存为dll文件。 动态分析 启动Promon。 进入注册表查看。 这个恶意代码向磁盘释放了什么&…

分享140个ASP源码,总有一款适合您

ASP源码 分享140个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 140个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1vxAMMEI7WYS8SAnfbJKdGQ?pwdsas8 提取码&#x…

【ARIXV2209】Multi-Scale Attention Network for Single Image Super-Resolution

【ARIXV2209】Multi-Scale Attention Network for Single Image Super-Resolution 代码&#xff1a;https://github.com/icandle/MAN 这是来自南开大学的工作&#xff0c;将多尺度机制与大核注意机制结合&#xff0c;用于图像超分辨率。 2022年初&#xff0c;大核卷积火了&a…