1.题目描述:
国际象棋每一个局面可以用大小为 8×8 的字符数组来表示,其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 k
、q
、r
、b
、n
、p
表示,其中大写字母对应白方、小写字母对应黑方。棋盘上无棋子处用字符 *
表示。两个字符数组的每一位均相同则说明对应同一局面。现已按上述方式整理好了每步棋后的局面,试统计每个局面分别是第几次出现。
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));
}
}
}