【CCF CSP】202305-1 重复局面

本文介绍了两种方法来统计在C++中象棋棋盘局面的重复次数:一种是通过三层循环逐个比较,另一种是利用map的键值唯一性实现。作者还讨论了内存效率和VS编辑器的快捷键问题。
摘要由CSDN通过智能技术生成

1. 题目要求

在这里插入图片描述

2. 前提

easy

3. 思想

第一种方法:常规思路。从第2次局面开始,每次局面与前面的所有局面进行比较,对相同局面的出现次数进行计数。
3层循环,最后竟然没超时我也是很惊讶。

第二种方法:利用map键值唯一的性质,将棋盘局面(包含64各字符的字符串string)设置为键值,将该局面是第几次出现设置为数据值,即map<string, int> status_map;
每次输入新的棋盘局面,就通过键值一步对比出是否重复,若重复,数据值+1;否则,数据值=1。
2层循环。

3. 代码

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	bool flag2;//是否存在相同的象棋局面
	int times;//表示该局面是第几次出现
	cin >> n;
	
	// 创建二维数组,初始化所有元素为0
	vector<vector<char>> arr(n, vector<char>(64,0));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 64; j++)
			cin >> arr[i][j];
	}
	cout << "1" << endl;
	for (int i = 1; i < n; i++) {
		times = 1;
		for (int k = 0; k < i; k++) {
			flag2 = true;
			for (int j = 0; j < 64; j++) {
				if (arr[i][j] != arr[k][j]) {
					flag2 = false;
				}
			}
			if (flag2)
				times += 1;
		}
		cout << times << endl;

	}
	system("pause");
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n;
char pieces[64];
map<string, int> status_map;
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 64; j++) 
            cin >> pieces[j];
        if (status_map.count(pieces)) //查看map中是否存在一个键值对,其键等于刚输入的字符串pieces。
            status_map[pieces] ++;//若存在,则说明出现重复局面,其对应次数+1.
        else 
            status_map[pieces] = 1;//若不存在,则说明这种局面是第一次出现
        cout << status_map[pieces] << endl;//输出第几次出现这种局面
    }
    return 0;
}

map<key,value>使用方法:
map.count(“amy”) //查看map中键值为amy的键值对有几个,只能为1或0,因为map键值唯一
status_map[pieces] ++; //map[key]==value ,所以相当于int类型的value++

4. 结果

在这里插入图片描述
话说,0ms是真的么……

5. 总结

1.如何用new给二维数组申请空间
https://blog.csdn.net/m0_74183164/article/details/130650498
【虽然使用vector更简单,一句代码就完成了,不用手动回收内存,但是似乎使用内存效率(其实也不太理解这是个啥意思)更低。】

2.绝了,真是绝了。vs注释快捷键是”ctrl+k,ctrl+c",原来是先按ctrl+k,再按ctrl+c……
我说怎么单独按谁都不管用,什么nc快捷键阿。为什么要从原来贼简单的"ctrl+/"改成这样阿。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值