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+/"改成这样阿。