国际象棋在对局时,同一局面连续或间断出现 33 次或 33 次以上,可由任意一方提出和棋。
国际象棋每一个局面可以用大小为 8×88×8 的字符数组来表示,其中每一位对应棋盘上的一个格子。
六种棋子王、后、车、象、马、兵分别用字母 k、q、r、b、n、p表示,其中大写字母对应白方、小写字母对应黑方。
棋盘上无棋子处用字符 *
表示。
两个字符数组的每一位均相同则说明对应同一局面。
现已按上述方式整理好了每步棋后的局面,试统计每个局面分别是第几次出现。
输入格式
输入的第一行包含一个正整数 n,表示这盘棋总共有 n 步。
接下来 8×n8× 行,依次输入第 11 到第 n步棋后的局面。具体来说每行包含一个长度为 88 的字符串,每 88 行字符串共 6464 个字符对应一个局面。
输出格式
输出共 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
可以将全部字符串读入组成一个整个字符串,这样这就是唯一的一个字符串,当后面与这个字符串相等时, 对应的哈希值加一
实际是利用字符串的ASCII码进行判断, 由于是将当前输入的局面出现的次数输出出来因此可以加完直接输出
```
#include <iostream>
#include <map>
using namespace std;
const int N = 1010;
int q[N];
int main()
{
int n;
cin >> n;
map<string, int> record; // string 对应一种局面,int 是他出现的次数
while(n --)
{
string x = ""; // x 记录的是当前的局面
for (int i = 0; i < 8; i ++)
{
string tmp;
cin >> tmp;
x += tmp; //将没一行添加到局面中
}
record[x] ++;
printf("%d\n", record[x]);
}
return 0;
}
```