国际象棋在对局时,同一局面连续或间断出现 3 次或 3 次以上,可由任意一方提出和棋。
国际象棋每一个局面可以用大小为 8×8 的字符数组来表示,其中每一位对应棋盘上的一个格子。
六种棋子王、后、车、象、马、兵分别用字母 k、q、r、b、n、p 表示,其中大写字母对应白方、小写字母对应黑方。
棋盘上无棋子处用字符
*
表示。两个字符数组的每一位均相同则说明对应同一局面。
现已按上述方式整理好了每步棋后的局面,试统计每个局面分别是第几次出现。
注意:判断重复局面仅涉及字符串比较,无需考虑国际象棋实际行棋规则。
输入格式
输入的第一行包含一个正整数 n,表示这盘棋总共有 n 步。
接下来 8×n 行,依次输入第 1 到第 n 步棋后的局面。具体来说每行包含一个长度为 8 的字符串,每 8 行字符串共 64 个字符对应一个局面。
输出格式
输出共 n 行,每行一个整数,表示该局面是第几次出现。
数据范围
1≤n≤100
输入样例:
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
样例解释
第 6、7 步后的局面分别与第 2、3 步后的局面相同。第 8 步后的局面与上图相对应。
题解:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
map<string, int> mp; // 定义一个 map(哈希表),用于存储 8×8 矩形的字符串和出现次数
for (int i = 0; i < n; i++) { // 遍历 n 个 8×8 矩形
string str; // 用于存储当前 8×8 矩形的字符串表示
for (int j = 0; j < 8; j++) { // 读取 8 行,每行 8 个字符
string s;
cin >> s; // 读取一行 8 个字符
str += s; // 拼接到 str 里,形成完整的 64 个字符字符串
}
mp[str]++; // 统计该 8×8 矩形出现的次数
cout << mp[str] << endl; // 输出当前矩阵的出现次数
}
return 0;
}