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

UVa 141 The Spot Game

题目分析

The Spot Game\texttt{The Spot Game}The Spot Game是一个基于N×NN \times NN×N棋盘的游戏,双方轮流执行操作,操作包括:

  • 在空白格子中放置一个黑子(用 “+” 表示);
  • 从棋盘上移除一个已有的黑子(用 “-” 表示)。

游戏规则如下:

  • 如果当前棋盘状态(或其旋转90°90°90°180°180°180°后的状态)在之前的游戏过程中已经出现过,则当前玩家立即输掉游戏,对方获胜;
  • 游戏最多进行2N2N2N步;
  • 如果在2N2N2N步后仍未出现重复状态,则游戏平局。

输入包含多组游戏,每组游戏的第一行为棋盘大小NNN2≤N≤502 \leq N \leq 502N50),接下来是2N2N2N行操作,每行包含坐标(x,y)(x, y)(x,y)和操作符+-。输入以000结束。

输出应指出获胜的玩家和获胜的步数,或声明游戏平局。

解题思路

核心问题

我们需要高效地检测棋盘状态是否重复(包括旋转后的状态)。由于棋盘最大可达50×5050 \times 5050×50,直接表示状态矩阵并比较的复杂度较高,但我们可以将状态编码成字符串进行存储和比较。

状态编码

我们可以用一个长度为N×NN \times NN×N的字符串表示棋盘状态:

  • ‘1’表示该位置有黑子;
  • ‘0’表示该位置为空。

每次操作后,更新对应的字符。

旋转处理

题目要求判断当前状态是否与之前任一状态在旋转0°0°90°90°90°(顺时针)、90°90°90°(逆时针)或180°180°180°后相同。因此,我们需要编写函数,分别生成当前状态的三种旋转状态。

为了便于比较,我们始终将旋转后的状态也编码为字符串,并存储到集合中。

查找重复

使用哈希表(如map<string, int>)存储所有出现过的状态(包括旋转后的状态),值为首次出现时的步数。

每步操作后,生成当前状态的四个等价状态(原状态 + 三种旋转),检查它们是否已经在哈希表中:

  • 如果存在,则当前玩家输,对方获胜;
  • 否则,将这四个状态插入哈希表,记录当前步数。

时间复杂度

每一步需要生成四个字符串,长度均为N2N^2N2,最多2N2N2N步,因此总时间复杂度约为O(N3)O(N^3)O(N3),在N≤50N \leq 50N50时是可接受的。

代码实现说明

以下代码使用C++\texttt{C++}C++编写,主要步骤包括:

  1. 读取NNN,若为 0 则结束;
  2. 初始化状态字符串和哈希表;
  3. 循环处理2N2N2N步操作:
    • 更新棋盘状态;
    • 检查当前状态是否已出现;
    • 生成旋转状态并插入哈希表;
  4. 根据是否出现重复状态输出结果。

参考代码

// The Spot Game// UVa ID: 141// Verdict: Accepted// Submission Date: 2016-01-20// UVa Run Time: 0.003s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;stringrotateCW90(string matrix,intn){string newMatrix;for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)newMatrix+=matrix[(n-1)*n+(i-1)-(j-1)*n];returnnewMatrix;}stringrotateCCW90(string matrix,intn){string newMatrix;for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)newMatrix+=matrix[(n-1)-(i-1)+(j-1)*n];returnnewMatrix;}stringrotate180(string matrix){reverse(matrix.begin(),matrix.end());returnmatrix;}intmain(){intn,x,y;string line;map<string,int>steps;while(cin>>n,n){intwinner=0,move=0;string matrix=string(n*n,'0');steps.clear();for(inti=1;i<=2*n;i++){cin>>x>>y;getline(cin,line);if(winner>0)continue;matrix[(x-1)*n+(y-1)]=(line.find('+')!=line.npos)?'1':'0';if(steps.find(matrix)!=steps.end()){winner=(steps[matrix]%2==1)?2:1;move=i;}string newMatrix[4]={matrix,rotateCW90(matrix,n),rotateCCW90(matrix,n),rotate180(matrix)};for(intj=0;j<4;j++)if(steps.find(newMatrix[j])==steps.end())steps.insert(make_pair(newMatrix[j],i));}if(winner==0)cout<<"Draw\n";elsecout<<"Player "<<winner<<" wins on move "<<move<<'\n';}return0;}
http://www.jsqmd.com/news/311434/

相关文章:

  • 一道“fork + 短路求值”经典题:到底会创建多少个进程?
  • UVa 142 Mouse Clicks
  • 金仓数据库KingbaseES 归档日志清理
  • 《MyBatis 从入门到上手:超全基础操作 + XML 配置指南》 - 教程
  • 细聊浙江退磁器价格,哪家产品性价比高?
  • 分析形象设计学校靠谱推荐,武汉新华学费多少钱
  • 2026天津用工风险法律机构排名揭晓,口碑好的律所都在这
  • 2026年杭州靠谱的AI营销公司排名,宇森GEO优化性价比值得关注
  • 2026年山西太原靠谱的断桥铝系统门窗服务商排名,科典门窗实力上榜
  • 分析微型小挖加工厂,济宁售后好的有哪些
  • 使用mysqldumpslow分析特定数据库用户的慢查询
  • 质感砖推荐,斯米茄打造静谧奢华空间效果怎么样?
  • 探寻罗蒙官网电话和主页,来样定制性价比排名
  • 2026年北京地区口碑好的大平层装修企业排名
  • 聊聊低温减速机厂家,鑫钺传动是不是优质之选?
  • 2026年哈尔滨口碑不错的管道疏通专业公司排名,哪家性价比更高?
  • 基于Spring Boot的驾校管理系统的设计与实现(毕业论文)
  • 亿图图示 v15 破解版下载及安装使用教程
  • 探讨客厅沙发家具店价格和性价比,南浔这家店口碑佳
  • 玻璃钢夹砂管道制造厂选哪家好,性价比厂家Top10
  • 分析超细纤维品牌制造商排名,柏丁达在广东排第几?
  • 飞斯达市场口碑怎么样,2026年黑龙江配电箱公司Top10
  • 黑龙江配电柜安装与采购费用分析,选飞斯达更划算
  • 江浙沪皖鲁国际高中留学本科选哪家,京岛义塾值得考虑
  • 第1章 人工智能:过去、现在与未来
  • 用户态/内核态 = 操作系统内核?
  • 《HelloGitHub》第 118 期
  • 基于Python进行人脸识别控制小灯闪烁(识别到指定人脸)
  • 神经网络深度解析:从神经元到深度学习的进化之路 - 教程
  • 详细介绍:深度学习理论与实战:用生活案例理解回归模型