news 2026/6/25 1:20:51

2024年3月GESP真题及题解(C++七级): 俄罗斯方块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2024年3月GESP真题及题解(C++七级): 俄罗斯方块

2024年3月GESP真题及题解(C++七级): 俄罗斯方块

题目描述

小杨同学用不同种类的俄罗斯方块填满了一个大小为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个方块的颜色。

输出格式

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

输入输出样例 1
输入 1
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
输出 1
7
说明/提示
子任务分数n , m ≤ n,m \leqn,m特殊约定
1 1130 303020 2020所有俄罗斯方块大小不超过5 × 5 5 \times 55×5
2 2230 3030500 500500所有俄罗斯方块大小均为1 × x 1 \times x1×xx × 1 x \times 1x×1类型,其中x xx是任意正整数
3 3340 4040500 500500

对全部的测试数据,保证1 ≤ n , m ≤ 500 1 \leq n, m \leq 5001n,m5001 ≤ a i , j ≤ n × m 1 \leq a_{i,j} \leq n \times m1ai,jn×m

思路分析

核心思路

统计网格中不同形状的连通块数量。关键点在于通过相对坐标标准化来识别形状,忽略颜色差异和位置平移。

算法流程
  1. 读取网格:存储颜色值
  2. 遍历每个未访问的格子:发现新连通块起点
  3. DFS搜索连通块
    • 标记已访问
    • 存储每个点相对于起点的坐标(相对坐标)
  4. 形状标准化:对相对坐标排序,消除遍历顺序影响
  5. 去重计数:使用set自动去重,最终set大小为不同形状数

代码实现

#include<bits/stdc++.h>usingnamespacestd;constintN=505;intn,m;inta[N][N];// 网格颜色intvs[N][N];// 访问标记intdx[4]={-1,1,0,0};// 上下左右intdy[4]={0,0,-1,1};// 当前连通块信息intsx,sy;// 连通块起点vector<pair<int,int>>block;// 相对坐标集合/** * DFS搜索同色连通块 * color 当前连通块颜色 * x,y 当前位置 * 功能:收集连通块所有点的相对坐标(相对于起点) */voiddfs(intcolor,intx,inty){vs[x][y]=1;// 存储相对坐标(当前点-起点)block.push_back({x-sx,y-sy});// 四方向搜索for(inti=0;i<4;i++){intnx=x+dx[i];intny=y+dy[i];// 边界检查、同色检查、未访问检查if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]==color&&!vs[nx][ny]){dfs(color,nx,ny);}}}intmain(){cin>>n>>m;// 读入网格for(inti=1;i<=n;i++)for(intj=1;j<=m;j++)cin>>a[i][j];memset(vs,0,sizeof(vs));set<vector<pair<int,int>>>s;// 形状集合(自动去重)// 遍历所有格子for(inti=1;i<=n;i++){for(intj=1;j<=m;j++){if(!vs[i][j]){// 发现新连通块sx=i;sy=j;// 设置起点block.clear();dfs(a[i][j],i,j);// 搜索连通块// 标准化:排序确保相同形状有相同表示sort(block.begin(),block.end());s.insert(block);// 自动去重}}}cout<<s.size()<<endl;// 不同形状数量return0;}

功能分析

核心功能

判断两个连通块是否为同一种类(通过平移可以重合)。

关键技术点
  1. 相对坐标表示

    // 存储相对坐标而非绝对坐标block.push_back({x-sx,y-sy});
    • 这样不同位置的相同形状会有相同的相对坐标集合
    • 自动处理了平移等价性
  2. 形状标准化

    sort(block.begin(),block.end());
    • 消除DFS遍历顺序的影响
    • 确保相同形状的连通块有完全相同的坐标序列
  3. 自动去重

    set<vector<pair<int,int>>>s;
    • 利用set自动去除重复形状
    • 每个形状表示为排序后的相对坐标向量
时间复杂度
  • DFS部分:O(n×m),每个格子访问一次
  • 排序部分:每个连通块内部排序,总复杂度O(klogk),k为连通块总大小
  • 总体复杂度:在网格大小500×500范围内可接受
空间复杂度
  • 存储网格:O(n×m)
  • DFS递归栈:最坏O(n×m)
  • 形状存储:O(形状数×平均大小)

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 14:15:15

Z-Image-Turbo_UI部署避坑指南:这些错误别再犯了

Z-Image-Turbo_UI部署避坑指南&#xff1a;这些错误别再犯了 你是不是也遇到过这样的情况&#xff1a;兴致勃勃地部署Z-Image-Turbo_UI&#xff0c;结果卡在启动环节&#xff0c;浏览器打不开界面&#xff0c;或者生成图片后找不到文件&#xff1f;别急&#xff0c;这些问题我…

作者头像 李华
网站建设 2026/6/15 5:10:57

开源向量模型怎么选?Qwen3-Embedding-4B实战测评指南

开源向量模型怎么选&#xff1f;Qwen3-Embedding-4B实战测评指南 在构建RAG系统、语义搜索服务或智能知识库时&#xff0c;嵌入模型&#xff08;Embedding Model&#xff09;就像整个系统的“语言翻译官”——它把人类语言转换成机器能理解的数字向量。选错模型&#xff0c;后…

作者头像 李华
网站建设 2026/6/22 9:29:41

Voice Sculptor捏声音模型解析|附LLaSA与CosyVoice2集成实践

Voice Sculptor捏声音模型解析&#xff5c;附LLaSA与CosyVoice2集成实践 1. 模型核心能力与技术背景 1.1 什么是Voice Sculptor&#xff1f; Voice Sculptor是一款基于LLaSA和CosyVoice2两大语音合成框架二次开发的指令化语音生成系统。它最大的特点在于&#xff1a;你不需要…

作者头像 李华
网站建设 2026/6/17 22:39:10

YOLOv9权重文件在哪?/root/yolov9目录结构一文详解

YOLOv9权重文件在哪&#xff1f;/root/yolov9目录结构一文详解 你是不是也遇到过这种情况&#xff1a;刚部署好YOLOv9环境&#xff0c;准备跑个推理试试效果&#xff0c;结果执行命令时提示“找不到weights文件”&#xff1f;或者想训练自己的模型&#xff0c;却不确定该把预训…

作者头像 李华
网站建设 2026/6/19 11:49:58

SmartDNS网络加速:3个简单技巧让家庭网速飞起来

SmartDNS网络加速&#xff1a;3个简单技巧让家庭网速飞起来 【免费下载链接】smartdns A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器&#xff0c;获取最快的网站IP&#xff0c;获得最佳上网体…

作者头像 李华
网站建设 2026/6/12 2:36:45

RedisInsight完整使用指南:从零开始掌握Redis可视化管理工具

RedisInsight完整使用指南&#xff1a;从零开始掌握Redis可视化管理工具 【免费下载链接】RedisInsight Redis GUI by Redis 项目地址: https://gitcode.com/GitHub_Trending/re/RedisInsight 还在为复杂的Redis命令行操作而头疼吗&#xff1f;RedisInsight作为Redis官方…

作者头像 李华