• 5081. 重复局面


    题目传送门 icon-default.png?t=N7T8https://www.acwing.com/problem/content/5084/

    国际象棋在对局时,同一局面连续或间断出现 33 次或 33 次以上,可由任意一方提出和棋。

    国际象棋每一个局面可以用大小为 8×88×8 的字符数组来表示,其中每一位对应棋盘上的一个格子。

    六种棋子王、后、车、象、马、兵分别用字母 k、q、r、b、n、p 表示,其中大写字母对应白方、小写字母对应黑方。

    棋盘上无棋子处用字符 * 表示。

    两个字符数组的每一位均相同则说明对应同一局面。

    现已按上述方式整理好了每步棋后的局面,试统计每个局面分别是第几次出现。

    1.png

    注意:判断重复局面仅涉及字符串比较,无需考虑国际象棋实际行棋规则。

    输入格式

    输入的第一行包含一个正整数 n,表示这盘棋总共有 n步。

    接下来 8×8 行,依次输入第 11 到第 n 步棋后的局面。具体来说每行包含一个长度为 8 的字符串,每 88 行字符串共 64 个字符对应一个局面。

    输出格式

    输出共 n行,每行一个整数,表示该局面是第几次出现。

    数据范围

    1≤n≤100

    输入样例:
    1. 8
    2. ********
    3. ******pk
    4. *****r*p
    5. p*pQ****
    6. ********
    7. **b*B*PP
    8. ****qP**
    9. **R***K*
    10. ********
    11. ******pk
    12. *****r*p
    13. p*pQ****
    14. *b******
    15. ****B*PP
    16. ****qP**
    17. **R***K*
    18. ********
    19. ******pk
    20. *****r*p
    21. p*p*****
    22. *b**Q***
    23. ****B*PP
    24. ****qP**
    25. **R***K*
    26. ******k*
    27. ******p*
    28. *****r*p
    29. p*p*****
    30. *b**Q***
    31. ****B*PP
    32. ****qP**
    33. **R***K*
    34. ******k*
    35. ******p*
    36. *****r*p
    37. p*pQ****
    38. *b******
    39. ****B*PP
    40. ****qP**
    41. **R***K*
    42. ********
    43. ******pk
    44. *****r*p
    45. p*pQ****
    46. *b******
    47. ****B*PP
    48. ****qP**
    49. **R***K*
    50. ********
    51. ******pk
    52. *****r*p
    53. p*p*****
    54. *b**Q***
    55. ****B*PP
    56. ****qP**
    57. **R***K*
    58. ********
    59. ******pk
    60. ******rp
    61. p*p*****
    62. *b**Q***
    63. ****B*PP
    64. ****qP**
    65. **R***K*
    输出样例:
    1. 1
    2. 1
    3. 1
    4. 1
    5. 1
    6. 2
    7. 2
    8. 1
    样例解释 

    第 6、7步后的局面分别与第 2、3 步后的局面相同。第 8 步后的局面与上图相对应。

    方法一:暴力枚举 

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 110;
    6. string g[N]; //字符串数组
    7. int main(){
    8. int n;
    9. cin>>n;
    10. for(int i=0;i
    11. string str;
    12. for(int j=0;j<8;j++){
    13. cin>>str;
    14. g[i]+=str; //把八行字符串换成一行
    15. }
    16. int cnt=0;
    17. for(int j=0;j
    18. if(g[i]==g[j])
    19. cnt++; //枚举对比,将新的一行字符串与前面的比较
    20. }
    21. cout<1<
    22. }
    23. return 0;
    24. }

    方法二:哈希表查询

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N = 110;
    7. string g[N];
    8. int main(){
    9. int n;
    10. cin>>n;
    11. unordered_mapint>cnt;
    12. for(int i=0;i
    13. string g,str;
    14. for(int j=0;j<8;j++){
    15. cin>>str;
    16. g+=str;
    17. }
    18. cout<<++cnt[g]<
    19. }
    20. return 0;
    21. }

    注:明显当枚举时也可以使用哈希表的方法

  • 相关阅读:
    webpack5 Preload / Prefetch解决按需求加载速度
    第2-2-4章 常见组件与中台化-常用组件服务介绍-分布式ID-附Snowflake雪花算法的代码实现
    数据库 -neo4j的基本操作
    tqdm学习
    小冰携手传祺,汽车座舱“虚拟人”渐成标配
    补充:selenium操作已打开的浏览器窗口
    同态加密简介HE
    Nuscenes数据集总结
    如何优化网站SEO(百度SEO优化的6个方案及密度)
    TMS320F28335启动过程
  • 原文地址:https://blog.csdn.net/m0_64005495/article/details/132740939