【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
    评论
引用和提供了两段代码,用于统计和存储字符串。这些代码使用不同的数据结构和算法来实现相同的功能。 引用的代码使用了unordered_map来存储字符串和对应的出现次数,然后通过遍历输入的字符串来更新该map。最后输出每个字符串的出现次数。 引用的代码使用了map来存储字符串和对应的出现次数。通过遍历输入的字符串,如果该字符串已经在map中存在,则将其出现次数加1,如果不存在,则将其插入到map中并初始化出现次数为1。最后输出每个字符串的出现次数。 综上所述,这两段代码都实现了统计字符串出现次数的功能,只是使用了不同的数据结构和算法。根据具体的需求和场景,选择合适的代码来解决问题即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CSP认证202305-1重复局面(c++)](https://blog.csdn.net/tsb2416443_/article/details/132647313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [CCF-CSP真题《202305-1 重复局面》思路+python,c++满分题解](https://blog.csdn.net/weixin_53919192/article/details/131489840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值