CCF-CSP真题202305-1重复局面(Java满分题解)

1.题目描述:

国际象棋每一个局面可以用大小为 8×8 的字符数组来表示,其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 kqrbnp 表示,其中大写字母对应白方、小写字母对应黑方。棋盘上无棋子处用字符 * 表示。两个字符数组的每一位均相同则说明对应同一局面。现已按上述方式整理好了每步棋后的局面,试统计每个局面分别是第几次出现。

2.输入格式

从标准输入读入数据。输入的第一行包含一个正整数n,表示这盘棋总共有n步。接下来 8×n行,依次输入第 1 到第n步棋后的局面。具体来说每行包含一个长度为 8 的字符串,每 8 行字符串共 64 个字符对应一个局面。

3.输出格式

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

四.思路

1.可以每8行字符串当作一个局面,在完成8行字符串的输入后,就将这8个字符串拼接为1个字符串。此时就可以把这一个字符串当作一个局面。
2.在n个局面的输入时每次声明一个字符串变量用于做每个局面中8个字符串的拼接。(这样不需要使用数组来存储这每个局面的字符串)
3.在每一次拼接成一个字符串的时候,使用HashMap将该字符串作为键放入Map中,便于统计当前局面的出现次数。使用HashMap同时也带来了时间上的优化。
4.在每个字符串代表的局面放入Map后就立刻得到这个字符串对应的值并打印,对时间做了一小部分优化。

Java(100分)

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
       HashMap<String,Integer> map = new HashMap<>();
       Scanner sc =new Scanner(System.in);
       int n = sc.nextInt();
       for(int i =0;i<n;i++){
           /*注意:在java中声明一个字符串不对其进行初始化的话,这个变量的值会默认赋值为为null
           * 后续对其运算操作时会抛出 NullPointerException   * */
           String str = "";
           for(int j = 0;j<8;j++){
               str += sc.next();
           }
           /* 在放入map时,同时使用了map的getOrDefault方法,代表如果已经出现过重复局面的话就在此次数上再加一。
           如果没出现过该局面的话就赋值为1  */
           map.put(str,map.getOrDefault(str,0)+1);
           System.out.println(map.get(str));
       }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北洋的霞洛

觉得不确可以给个鼓励小费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值