【CSP CCF记录】202305-1第30次认证 重复局面
题目
样例输入
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
思路
这道题思路很简单,即看当前局面出现了几次。
可以设一个数据类型<string,int>的map容器,键为8x8的棋盘局面(即一个64个字符元素的字符串),值为出现次数。
每次输入一个8x8的棋盘后判断当前局面是否第一次出现,如是第一次则将当前局面加入map容器;如不是第一次,则修改当前键对应的数据值。
map的写法和用法可以参考我另一篇文章:【CSP CCF记录】备考知识点总结-CSDN博客
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
map<string,int>m;
cin>>n;
for(int i=0;i<n;i++)
{
string chess;
for(int j=0;j<8;j++)
{
string str;
cin>>str;
chess=chess+str;
}
auto it = m.find(chess); // 查找键为chess的元素
int num=0;
if (it != m.end()) {
num=m[chess]+1;
m[chess]=num;
cout<<num<<endl;
}else {
num=1;
m[chess]=num;
cout<<num<<endl;
}
}
return 0;
}