CCF模拟题 202305-1 重复局面

试题编号: 202305-1
试题名称: 重复局面
时间限制: 1.0s
内存限制: 512.0MB

题目背景
国际象棋在对局时,同一局面连续或间断出现3次或3次以上,可由任意一方提出和棋。

问题描述
国际象棋每一个局面可以用大小为 8×8 的字符数组来表示,其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 k、q、r、b、n、p 表示,其中大写字母对应白方、小写字母对应黑方。棋盘上无棋子处用字符 * 表示。两个字符数组的每一位均相同则说明对应同一局面。

现已按上述方式整理好了每步棋后的局面,试统计每个局面分别是第几次出现。
在这里插入图片描述

输入格式
从标准输入读入数据。
输入的第一行包含一个正整数 n,表示这盘棋总共有 n 步。
接下来 8×n 行,依次输入第 1 到第 n 步棋后的局面。具体来说每行包含一个长度为 8 的字符串,每 8 行字符串共 64 个字符对应一个局面。

输出格式
输出到标准输出中。
输出共 n 行,每行一个整数,表示该局面是第几次出现。

样例输入

8
********
******pk
*****r*p
p*pQ****
********
**b*B*PP
****qP**
**R***K*
********
******pk
*****r*p
p*pQ****
*b******
****B*PP
****qP**
**R***K*
********
******pk
*****r*p
p*p*****
*b**Q***
****B*PP
****qP**
**R***K*
******k*
******p*
*****r*p
p*p*****
*b**Q***
****B*PP
****qP**
**R***K*
******k*
******p*
*****r*p
p*pQ****
*b******
****B*PP
****qP**
**R***K*
********
******pk
*****r*p
p*pQ****
*b******
****B*PP
****qP**
**R***K*
********
******pk
*****r*p
p*p*****
*b**Q***
****B*PP
****qP**
**R***K*
********
******pk
******rp
p*p*****
*b**Q***
****B*PP
****qP**
**R***K*

样例输出

1
1
1
1
1
2
2
1

在这里插入图片描述

Java代码:

// CCF_2023_05_1
import java.util.*;public class Main{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = Integer.parseInt(scanner.nextLine()); // 读取局面数量// 使用HashMap存储每个局面出现的次数Map<String, Integer> positionFrequencyMap = new HashMap<>();List<Integer> output = new ArrayList<>(); // 存储输出结果// 读取每个局面for (int i = 0; i < n; i++) {StringBuilder position = new StringBuilder();for (int j = 0; j < 8; j++) {position.append(scanner.nextLine());}String positionString = position.toString();// 更新局面出现次数positionFrequencyMap.put(positionString, positionFrequencyMap.getOrDefault(positionString, 0) + 1);// 将当前局面的出现次数添加到输出结果列表中output.add(positionFrequencyMap.get(positionString));}// 打印输出结果for (int freq : output) {System.out.println(freq);}scanner.close();}
}

C语言代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define BOARD_SIZE 8
#define MAX_POSITIONS 100// 函数进行字符串哈希
unsigned long hash(char *str) {unsigned long hash = 5381;int c;while ((c = *str++)) {hash = ((hash << 5) + hash) + c; // hash * 33 + c}return hash;
}int main() {int n, step;char positions[MAX_POSITIONS][BOARD_SIZE * BOARD_SIZE + 1]; // 存储所有局面字符串int counts[MAX_POSITIONS] = {0}; // 存储所有局面的出现次数char board[BOARD_SIZE][BOARD_SIZE + 1]; // 暂存棋盘的单一局面char position[BOARD_SIZE * BOARD_SIZE + 1]; // 暂存单一局面的字符串表示unsigned long hashes[MAX_POSITIONS]; // 存储局面字符串的哈希unsigned long hashValue;int results[MAX_POSITIONS]; // 存储所有结果scanf("%d\n", &n);int totalPositions = 0;for (step = 0; step < n; ++step) {// 读入棋盘局面for (int i = 0; i < BOARD_SIZE; ++i) {fgets(board[i], BOARD_SIZE + 2, stdin); // +2 for newline and null-terminator}// 将局面转为一个字符串for (int i = 0, k = 0; i < BOARD_SIZE; ++i) {for (int j = 0; j < BOARD_SIZE; ++j, ++k) {position[k] = board[i][j];}}position[BOARD_SIZE * BOARD_SIZE] = '\0'; // 确保正确结束字符串// 计算局面字符串的哈希hashValue = hash(position);// 检查是否已经存在此局面int found = 0;for (int i = 0; i < totalPositions; ++i) {if (hashes[i] == hashValue && strcmp(positions[i], position) == 0) {counts[i]++;results[step] = counts[i];found = 1;break;}}// 如果没找到,记录新局面if (!found) {strcpy(positions[totalPositions], position);hashes[totalPositions] = hashValue;counts[totalPositions] = 1;results[step] = 1;totalPositions++;}}// 输出所有结果for (int i = 0; i < n; ++i) {printf("%d\n", results[i]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring之整合Mybatis底层源码

文章目录 一、整体核心思路1 . 简介2. 整合思路 二、源码分析1. 环境准备2. 源码分析 一、整体核心思路 1 . 简介 有很多框架需要与Spring进行整合&#xff0c;而整合的核心思路就是把其他框架所产生的对象放到Spring容器中&#xff0c;让其成为一个bean。比如Mybatis&#x…

《Vue2 进阶知识》动态挂载组件之Vue.extend + vm.$mount

前言 目前工作还是以 Vue2 为主&#xff0c;今早有人提问 如何动态挂载组件&#xff1f; 话说很久很久以前就实现过&#xff0c;今天再详细的整理一下此问题&#xff01; 开始 动态组件如下&#xff0c;是个简单的例子&#xff1a; 但请注意这里给了个 id"test2"…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的…

虹软人脸识别白屏

1.修改jdk为1.8 2.编译版本ndk修改 ndk {abiFilters armeabi-v7a, arm64-v8a} 3.local.properties增加ndk路径 ndk.dirH\:\\Android\\SDK\\ndk\\21.1.6352462 4.最重要的一步:检查依赖库是否存在前一定要先检查有么有读取本地文件权限,下面的代码即使是放到点击事件的回调…

访问学者申请需要注意什么?

访问学者申请是一项复杂而重要的过程&#xff0c;需要申请人在准备材料和过程中注意一些关键事项&#xff0c;以确保顺利完成申请并提高成功率。以下是知识人网小编的一些建议&#xff0c;希望对你的访问学者申请有所帮助。 1. 详细了解目标学术机构&#xff1a; 在申请访问学…

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式 前提docker环境已经安装好 如未安装&#xff0c;请参考博文https://blog.csdn.net/a554521655/article/details/134251763 文章目录 ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式安装emqx查看是否安装并启动成功登录前端查 安…

毕业2年,存款达到700W,我选择躺平!

毕业2年&#xff0c;存款达到700W&#xff0c;我选择躺平&#xff01; 最近一个字节跳动员工的爆料引发了大家对生活意义的思考。这位员工毕业两年&#xff0c;却已经存款达到700万元&#xff0c;并选择了“躺平”。 当今社会&#xff0c;职场竞争与生活压力的存在是普遍的现…

three.js 使用 tweenjs绘制相机运动动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

反爬虫策略:使用FastAPI限制接口访问速率

目录 引言 一、网络爬虫的威胁 二、FastAPI 简介 三、反爬虫策略 四、具体实现 五、其他反爬虫策略 六、总结 引言 在当今的数字时代&#xff0c;数据已经成为了一种宝贵的资源。无论是商业决策、科学研究还是日常生活&#xff0c;我们都需要从大量的数据中获取有价值的…

高斯数据库 Gauss

gauss DB OLTP 交易 保证数据和安全&#xff0c;主要是银行使用 gauss DB OLAP 分析 大部分是网络公司 gsql 使用gauss数据库的工具 $ gsql -d 数据库名 -p 端口号 -u 用户名 -w 密码 -h 客户端ipgsql 常用参数 -d选项&#xff1a; 指定gsql客户端连接的数据库-h选项&#xff1…

SCA|可作为有效改进策略的算法——正余弦优化算法(Matlab/Python)

正余弦优化算法(Sine cosine algorithm&#xff0c;SCA)是由Mirjalili [1]在2016年提出&#xff0c;目前WOS上引用量2K&#xff0c;谷歌学术上4K。 不得不说Seyedali Mirjalili真是位大神级的人物(下图是Mirjalili开发的部分算法) SCA的核心思想是利用正、余弦函数波动的周期性…

uni-app修改头像和个人信息

效果图 代码&#xff08;总&#xff09; <script setup lang"ts"> import { reqMember, reqMemberProfile } from /services/member/member import type { MemberResult, Gender } from /services/member/type import { onLoad } from dcloudio/uni-app impor…