当前位置: 首页 > news >正文

UVa 339 SameGame Simulation

题目描述

单人游戏SameGame\texttt{SameGame}SameGame在一个MMMNNN列的矩形网格上进行。每个格子中包含一个000999之间的正整数。游戏的目标是移除网格中的所有数字。玩家通过重复选择一个格子进行消除来尝试达成目标。

每次选择一个格子进行消除时,包含该格子中相同数字的连通区域(定义如下)中的所有格子都会被移除,然后被移除格子上方的格子向下掉落,右侧的列向左滑动。当所有格子都被移除时游戏胜利,或者当无法再移除任何格子时游戏结束。一个区域只有在包含至少两个格子时才能被移除。

连通区域的定义:从区域中的任何格子出发,通过水平(左/右)和/或垂直(上/下)移动可以到达的所有格子,且这些格子必须包含相同的数值。

坐标系统:格子从网格的左下角开始编号,该格子为(1,1)(1,1)(1,1)。其上方的格子为(2,1)(2,1)(2,1),其右侧的格子为(1,2)(1,2)(1,2)

输入格式

输入完全由非负整数组成,不考虑行结构。每个网格和消除序列以MMMNNN的值开始。如果其中任何一个值为000,则输入结束。

接下来是M×NM \times NM×N个网格整数,按行主序给出(即按(1,1),(1,2),…,(1,N),(2,1),…,(M,N)(1,1), (1,2), \dots, (1,N), (2,1), \dots, (M,N)(1,1),(1,2),,(1,N),(2,1),,(M,N)的顺序)。

网格数据之后是若干对整数,每对表示被选择消除的格子的行和列。这个序列以一对0 0结束。

如果游戏获胜,程序必须跳过剩余的所有整数对(包括0 0),以读取下一个网格的数据。

输出格式

对于每个网格,输出其编号(从111开始)。然后输出处理所有选择后剩余的网格,或者消息Game Won

样例输入

3 5 1 2 3 5 5 2 2 3 5 1 1 3 5 2 2 3 5 2 2 1 2 1 1 0 0 3 5 1 2 3 5 5 2 2 3 5 1 1 3 5 2 2 2 2 1 2 1 4 1 2 99 99 0 0 4 3 1 4 4 4 4 2 1 2 3 3 1 3 1 2 1 1 1 3 1 1 0 0 0 0

样例输出

Grid 1. Game Won Grid 2. 1 2 1 2 1 Grid 3. Game Won

题目分析

问题的本质

这是一个网格消除游戏的模拟问题。核心操作包括:

  1. 连通区域检测:使用洪水填充(flood fill\texttt{flood fill}flood fill)标记与选中格子同值且连通的区域
  2. 区域移除:将标记的格子设为−1-11(表示空)
  3. 重力下落:空位上方的格子向下掉落
  4. 列左移:全空的列向左滑动

坐标系统

注意:题目中的坐标系统与通常的二维数组索引不同:

  • (1,1)(1,1)(1,1)是左下角
  • (2,1)(2,1)(2,1)(1,1)(1,1)(1,1)上方的格子
  • 行号从下到上递增

在代码实现中,通常使用grid[r][c],其中r=1对应最下面一行,r=M对应最上面一行。这与输入顺序一致(先输入第111行,即最下面一行)。

消除条件

一个选择是有效的当且仅当:

  • 选中的格子存在(1≤row≤M1 \leq row \leq M1rowM1≤column≤N1 \leq column \leq N1columnN
  • 选中的格子不是空的(grid[row][column] >= 0
  • 选中的格子属于一个至少有两个格子的连通区域

连通区域的判断可以通过检查上下左右四个方向是否有相同数值的格子。


参考代码

// SameGame Simulation// UVa ID: 339// Verdict: Accepted// Submission Date: 2016-07-06// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intM,N,grid[50][50],cases=0;intoffset[4][2]={{0,1},{1,0},{0,-1},{-1,0}};// 洪水填充:标记所有与 (row, column) 连通且值为 value 的格子voidfloodFill(introw,intcolumn,intvalue){if(row>=1&&row<=M&&column>=1&&column<=N)if(grid[row][column]==value){grid[row][column]=-1;// 标记为已移除for(intk=0;k<4;k++)floodFill(row+offset[k][0],column+offset[k][1],value);}}// 下落和左移调整voidadjust(){// 阶段1:重力下落(格子向下掉落)for(intc=1;c<=N;c++){intlow=1;// 找到第一个空位while(low<=M&&grid[low][c]>=0)low++;if(low==M+1)continue;// 该列已满// 将非空格子向下移动for(intup=low+1;up<=M;up++)if(grid[up][c]>=0){grid[low][c]=grid[up][c];grid[up][c]=-1;low++;}}// 阶段2:空列左移intmovedColumn=0;for(intc=N;c>=1;c--){// 检查当前列是否为空boolemptyColumn=true;for(intr=1;r<=M;r++)if(grid[r][c]>=0){emptyColumn=false;break;}if(emptyColumn==false)continue;// 将右侧列向左移动for(intr=1;r<=M;r++){for(intemptyC=c;emptyC<N-movedColumn;emptyC++)grid[r][emptyC]=grid[r][emptyC+1];}// 清空最右侧的列for(intr=1;r<=M;r++)grid[r][N-movedColumn]=-1;movedColumn++;}}// 输出当前网格(从顶部行开始)voiddisplay(){for(intr=M;r>=1;r--){for(intc=1;c<=N;c++)cout<<" "<<grid[r][c];cout<<endl;}}intmain(intargc,char*argv[]){ios::sync_with_stdio(false);while(cin>>M>>N,M&&N){// 读取网格(从底部行开始)for(intr=1;r<=M;r++)for(intc=1;c<=N;c++)cin>>grid[r][c];introw,column;while(cin>>row>>column,row&&column){// 检查选择是否有效if(row<=0||row>M||column<=0||column>N)continue;if(grid[row][column]==-1)continue;// 检查是否有相邻的同值格子(区域大小 ≥ 2)boollinked=false;for(intk=0;k<4;k++){intnextRow=row+offset[k][0],nextColumn=column+offset[k][1];if(nextRow<1||nextRow>M||nextColumn<1||nextColumn>N)continue;if(grid[nextRow][nextColumn]==grid[row][column]){linked=true;break;}}if(linked==false)continue;// 执行消除floodFill(row,column,grid[row][column]);adjust();}// 输出结果if(cases)cout<<endl;cout<<"Grid "<<++cases<<"."<<endl;// 检查是否获胜intcell=0;for(intr=1;r<=M;r++)for(intc=1;c<=N;c++)if(grid[r][c]>=0)cell++;if(cell==0)cout<<" Game Won"<<endl;else{// 输出剩余网格for(intr=M;r>=1;r--){cout<<" ";for(intc=1;c<=N;c++)if(grid[r][c]>=0)cout<<" "<<grid[r][c];elsecout<<" ";cout<<endl;}}}return0;}
http://www.rkmt.cn/news/1429286.html

相关文章:

  • 基于LoRa与ESP32的远程智能温控系统:无网络覆盖场景的自动化实践
  • 【Agent 开发】一文看懂三种 RAG 架构:Classic RAG、Graph RAG 与 Agentic RAG
  • 非标零件加工有哪些工艺?CNC、电火花、激光各有什么优缺点
  • 【A11】统一实体标识符(UEID)规范
  • 为什么92%的团队用Gemini生成报告仍被拒稿?——资深审稿人亲揭学术/合规双红线及5分钟修复法
  • 当Epson T3机器人遇上欧姆龙CJ2M:手把手教你用Fins TCP协议绕过Modbus限制
  • 基于树莓派打造可定制数字时钟:从硬件选型到软件配置全解析
  • AutoDock Vina终极指南:快速掌握分子对接神器,轻松完成药物筛选
  • 【Redis分布式缓存实战】第1章 分布式缓存前置认知:为什么企业首选Redis
  • 【系统学AI】15 RAG评测体系:RAGAS四维+TruLens+ARES全套方案
  • 洛谷-P11240 [KTSC 2024 R2] 回文判定 题解
  • 3DS游戏存档终极保护指南:用JKSM轻松备份和恢复你的游戏进度
  • DS4Windows技术深度解析:跨平台手柄映射架构设计与实现
  • 5步完全指南:掌握Unlock Music浏览器音乐解密终极方案
  • 合豚为什么更像“底层系统”,而不是普通设备商?
  • 【Gemini财务分析报告权威解读】:2024年Q2财报暗藏的5大现金流预警信号及3步应对法
  • 如何轻松下载抖音无水印视频:完整指南与实用技巧
  • Hitboxer:免费专业级SOCD按键重映射工具,彻底解决游戏输入冲突
  • 节假日亲子游玩好去处推荐,马岭天观登高祈福、山间游乐适配全年龄段 - 玖叁鹿geo
  • 终极Windows系统管理神器:Chris Titus Tech WinUtil一键优化完整指南
  • 2026年旧房翻新大揭秘!靠谱机构究竟该怎么选?
  • 技术方案:Figma-to-JSON实现设计文件与结构化数据的双向转换
  • 使用图像识别点击评论按钮
  • 物联网卡、流量卡、SIM 卡到底有什么区别?
  • AI Agent Harness Engineering 与具身智能:当大脑拥有了身体
  • 工业应急指挥调度方案:实时态势感知,防控厂区安全隐患
  • 氙弧老化测试全参数解析:滤镜类型、辐照度与黑标温度设定
  • 2026 常州geo优化公司推荐丨常州网络公司丨常州geo广告丨常州geo系统丨常州豆包优化公司推荐及电话联系 - 资讯纵览
  • 小桌签 —— 一个编程小白用华为云码道(CodeArts),1 小时做出自己的第一个网页 App
  • 移动通信网络规划与优化:从基础筑基到智能提质的全链路解析