news 2026/4/23 9:53:28

UVa 141 The Spot Game

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:52:15

UVa 142 Mouse Clicks

题目分析 本题模拟了一个简单的窗口系统&#xff0c;需要处理鼠标点击事件&#xff0c;根据点击位置确定选中的区域&#xff08;Region\texttt{Region}Region&#xff09;或图标&#xff08;Icon\texttt{Icon}Icon&#xff09;。 关键规则&#xff1a; 如果点击位置在某个区…

作者头像 李华
网站建设 2026/4/20 10:40:01

基于Python进行人脸识别控制小灯闪烁(识别到指定人脸)

这里我没有给 ESP8266 刷入 MicroPython 固件&#xff0c;而是用的Python和Mixly&#xff08;在Mixly上写的代码&#xff0c;这个是一个可以图形化的软件&#xff0c;也可以进行部分代码编写&#xff0c;当然复杂程序还是用Arduino IDE&#xff0c;这边两者都可实现&#xff0c…

作者头像 李华
网站建设 2026/4/22 8:10:30

【毕设项目计算机毕设】基于springboot+vue实现的在线考试系统

一、前言 在当今数字化转型的时代背景下&#xff0c;教育行业也在积极探索利用信息技术提升教学质量和效率的方式。在线考试系统作为教育信息化的重要组成部分&#xff0c;正逐渐成为学校、培训机构乃至企业进行考核评价的首选工具。它不仅能够有效解决传统纸质考试的诸多局限…

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

px4+ubuntu22.04+ros2开发记录

1.环境搭建中遇到的问题 安装ros2&#xff1a;参考小鱼的一键安装 安装px4&#xff1a;参考&#xff1a; PX4 自动驾驶仪用户指南 | PX4 Guide (main) 最新PX4xROS2保姆级仿真部署教程来了&#xff01;_ros2 px4-CSDN博客 1.1 问题一&#xff1a;gazebo sim仿真没有模型 描述…

作者头像 李华
网站建设 2026/4/17 16:13:38

Cursor Agent Skill 原理及LLM , Agent, MCP ,Skill区别

//////////////////////////////////////////////////////////////////原理与核心概念Agent 定义&#xff1a;Cursor 内置的“自主任务执行器”。你给出目标&#xff0c;它会自主规划步骤、调用文件读取、搜索、编辑、运行命令等能力完成任务&#xff0c;并把状态同步给你。Ski…

作者头像 李华
网站建设 2026/4/9 10:02:46

Yjs 前端实时协作库学习笔记

核心定位 纯前端 / Node.js 通用的实时协作数据一致性库&#xff0c;基于 CRDT&#xff08;无冲突复制数据类型&#xff09;实现&#xff0c;核心解决「多人同时修改数据、断网离线修改数据」后的数据自动统一问题&#xff0c;是前端开发在线文档、白板、表格等协作类应用的核…

作者头像 李华