news 2026/6/15 8:29:22

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/6/15 11:22:27

有考虑过ai自己grep调用记忆吗

https://www.bilibili.com/video/BV1iC4LzpE7p 你提到的视频《RAG已死&#xff1f;Claude Code核心开发者抛弃RAG》中&#xff0c;Claude Code 的核心开发者 Boris 提出了一种“完全不做索引”的反直觉检索方式——这实际上是在挑战传统 RAG&#xff08;Retrieval-Augmented G…

作者头像 李华
网站建设 2026/6/15 13:15:26

安卓驱动开发工程师职位深度解析与面试指南

深圳达实智能股份有限公司 安卓驱动开发工程师 职位信息 负责安卓系统底层驱动的设计、开发、调试、集成与性能优化工作。 负责Android Framework及内核等系统框架层的调优,关键模块开发实现及调试定位。 系统API设计和开发,安卓SDK定制和维护。 二、 任职要求: 1. 基础要求…

作者头像 李华
网站建设 2026/6/15 11:24:08

duckDB C++源代码解析

从 pypi.org下载 duckdb-1.4.4.tar.gz 解析 DuckDB 的 C 源代码&#xff0c;核心是理解其整体架构、核心模块的实现逻辑以及关键代码的设计思路。DuckDB 作为一款高性能的嵌入式分析型数据库&#xff0c;其 C 源码结构清晰且遵循现代 C 最佳实践&#xff0c;下面我会从整体架…

作者头像 李华
网站建设 2026/6/15 11:25:30

李彦宏的春晚赌注:5亿红包能砸出百度AI“第二春”吗?

1月25日&#xff0c;百度APP官宣两大动作。一是成为《2026北京广播电视台春节联欢晚会》首席AI合作伙伴&#xff0c;二是推出为期近两个月的春节现金红包活动——从1月26日持续到3月12日&#xff0c;若用户在百度APP上启用文心助手&#xff0c;则能够参与到瓜分总额达5亿元人民…

作者头像 李华
网站建设 2026/6/15 11:25:12

词向量:AI理解语言的基石

本文作者为 360 奇舞团前端开发工程师一句话总结&#xff1a;词向量不是炫技的数学玩具&#xff0c;而是让机器具备初步“语义直觉”的关键技术&#xff0c;是语义搜索、智能推荐、多模态系统等现代 AI 应用的底层基石。一、为什么需要词向量&#xff1f;—— 传统方法的困境在…

作者头像 李华
网站建设 2026/6/15 13:17:00

大模型推理卡顿?vLLM的PagedAttention三分钟提速

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 目录 破局大模型推理瓶颈&#xff1a;PagedAttention如何实现三分钟提速&#xff1f; 一、卡顿之源&#xff1a;KV缓存管理的“内存碎片化”困局 二、破局关键&#xff1a;PagedAttenti…

作者头像 李华