news 2026/4/18 14:41:50

GESP认证C++编程真题解析 | P10379 [GESP202403 七级] 俄罗斯方块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GESP认证C++编程真题解析 | P10379 [GESP202403 七级] 俄罗斯方块

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


【题目来源】

洛谷:[P10379 GESP202403 七级] 俄罗斯方块 - 洛谷

【题目描述】

小杨同学用不同种类的俄罗斯方块填满了一个大小为n × m n \times mn×m的网格图。

网格图由n × m n \times mn×m个带颜色方块构成。小杨同学现在将这个网格图交给了你,请你计算出网格图中俄罗斯方块的种类数。
如果两个同色方块是四连通(即上下左右四个相邻的位置)的,则称两个同色方块直接连通;若两个同色方块同时与另一个同色方块直接或间接连通,则称两个同色方块间接连通。一个俄罗斯方块由一个方块和所有与其直接或间接连接的同色方块组成。定义两个俄罗斯方块的种类相同当且仅当通过平移其中一个俄罗斯方块可以和另一个俄罗斯方块重合;如果两个俄罗斯方块颜色不同,仍然视为同一种俄罗斯方块。

例如,在如下情况中,方块1 11和方块2 22是同一种俄罗斯方块,而方块1 11和方块3 33不是同一种俄罗斯方块。

【输入】

第一行包含两个正整数n nnm mm,表示网格图的大小。
对于之后的n nn行,第i ii行包含m mm个正整数a i 1 , a i 2 , … a i m a_{i1}, a_{i2}, \dots a_{im}ai1,ai2,aim,表示该行m mm个方块的颜色。

【输出】

输出一行一个整数表示答案。

【输入样例】

5 6 1 2 3 4 4 5 1 2 3 3 4 5 1 2 2 3 4 5 1 6 6 7 7 8 6 6 7 7 8 8

【输出样例】

7

【算法标签】

《洛谷 P10379 俄罗斯方块》 #模拟# #搜索# #GESP# #2024#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=505;intn,m,k,s,t,sx,sy;// n,m: 网格大小, sx,sy: 当前连通块的起始点inta[N][N];// 存储网格中的值intans;// 结果,不同形状的数量intvis[N][N];// 访问标记数组// 四个方向的偏移量:右、下、左、上intd[4][2]={{0,1},{1,0},{0,-1},{-1,0}};vector<pair<int,int>>e;// 存储当前连通块中所有点的相对坐标set<vector<pair<int,int>>>se;// 存储所有不同形状的连通块// 深度优先搜索,用于寻找连通块voiddfs(intx,inty){// 将当前点的相对坐标(相对于连通块起始点)存入向量ee.push_back({x-sx,y-sy});// 标记当前点已访问vis[x][y]=1;// 遍历四个方向for(inti=0;i<4;i++){intxx=x+d[i][0];// 新的x坐标intyy=y+d[i][1];// 新的y坐标// 检查新坐标是否有效if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&// 在网格范围内a[xx][yy]==a[x][y]&&// 值相同!vis[xx][yy])// 未访问过{dfs(xx,yy);// 继续深度优先搜索}}}intmain(){// 输入网格大小cin>>n>>m;// 输入网格数据for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){cin>>a[i][j];}}// 遍历整个网格for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){// 如果当前点未访问过if(!vis[i][j]){// 记录连通块的起始点sx=i;sy=j;// 从当前点开始深度优先搜索,找到整个连通块dfs(i,j);// 将当前连通块的形状(相对坐标向量)插入集合// 集合会自动去重se.insert(e);// 清空向量,为下一个连通块做准备e.clear();}}}// 输出不同形状的数量cout<<se.size()<<endl;return0;}

【运行结果】

5 6 1 2 3 4 4 5 1 2 3 3 4 5 1 2 2 3 4 5 1 6 6 7 7 8 6 6 7 7 8 8 7
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:06:39

好写作AI:冷门专业的福音!仅需5篇范文,AI秒懂你的领域

你是否曾感叹&#xff1a;“这个AI连‘细胞焦亡’和‘铁死亡’都分不清&#xff0c;怎么帮我写生物论文&#xff1f;”别急&#xff0c;这就是通用模型的局限。但「好写作AI」最新的少样本学习技术&#xff0c;正让AI化身为“速成学霸”——仅凭你提供的少量材料&#xff0c;就…

作者头像 李华
网站建设 2026/4/18 8:20:48

Open-AutoGLM部署实战详解(全网稀缺配置方案曝光)

第一章&#xff1a;Open-AutoGLM部署实战概述Open-AutoGLM 是一个面向自动化代码生成与自然语言任务处理的开源大语言模型框架&#xff0c;支持本地化部署与私有化调用&#xff0c;适用于企业级 AI 助手、智能编程补全和文档自动生成等场景。其核心优势在于模块化设计、轻量级依…

作者头像 李华
网站建设 2026/4/18 8:38:19

EtherCalc开源协作表格终极指南:打造高效团队数据协同平台

EtherCalc开源协作表格终极指南&#xff1a;打造高效团队数据协同平台 【免费下载链接】ethercalc Node.js port of Multi-user SocialCalc 项目地址: https://gitcode.com/gh_mirrors/et/ethercalc EtherCalc是一款基于Node.js构建的开源实时协作电子表格工具&#xff…

作者头像 李华
网站建设 2026/4/18 11:02:38

如何快速掌握AutoRaise:macOS窗口管理的终极效率提升指南

如何快速掌握AutoRaise&#xff1a;macOS窗口管理的终极效率提升指南 【免费下载链接】AutoRaise AutoRaise (and focus) a window when hovering over it with the mouse 项目地址: https://gitcode.com/gh_mirrors/au/AutoRaise AutoRaise是一款革命性的macOS开源工具…

作者头像 李华
网站建设 2026/4/18 7:33:28

n8n工作流自动化完全指南:从入门到实战

n8n工作流自动化完全指南&#xff1a;从入门到实战 【免费下载链接】n8n n8n 是一个工作流自动化平台&#xff0c;它结合了代码的灵活性和无代码的高效性。支持 400 集成、原生 AI 功能以及公平开源许可&#xff0c;n8n 能让你在完全掌控数据和部署的前提下&#xff0c;构建强大…

作者头像 李华
网站建设 2026/4/18 11:03:21

产品开发周期模型实战系列之迭代模型:多轮闭环优化,破解需求逐步细化的复杂项目开发难题

在复杂项目的开发迷宫中&#xff0c;最大的挑战往往不是技术本身&#xff0c;而是那些在项目启动时无法看清、在过程中不断涌现的细节需求。传统的“一次性定义&#xff0c;一次性交付”线性模式&#xff0c;在此刻显得力不从心&#xff0c;常常陷入需求理解偏差、后期变更成本…

作者头像 李华