问题分析:

1.对于行和列,要求得每行或每列的棋子个数,只需要把横坐标或纵坐标相同的棋子数目相加即可,然后使用k*(k-1)/2就可求得攻击次数

2.对于对角线上的点,需要分析对角线上点的坐标关系。分析得到,右下对角线上的点横纵坐标之差相等,左下对角线上的点横纵坐标之和相等,分析出来后接下来做法就和处理行和列上点一样。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner; public class QueenAttack{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int n = scan.nextInt();
HashMap<Integer, Integer> mapRow = new HashMap<Integer, Integer>();
HashMap<Integer, Integer> mapCol = new HashMap<Integer, Integer>();
HashMap<Integer, Integer> mapLeft = new HashMap<Integer, Integer>();
HashMap<Integer, Integer> mapRight = new HashMap<Integer, Integer>();
int[][] array = new int[n][2];
// 输入放有棋子的横纵坐标,同时计算出每行有多少个棋子,每列有多少个棋子
for (int i = 0; i < n; i++) {
array[i][0] = scan.nextInt();
int x = array[i][0];
array[i][1] = scan.nextInt();
int y = array[i][1];
// 计算当前行有多少棋子
numChess(mapRow, x);
// 计算当前列有多少棋子
numChess(mapCol, y);
// 计算左下对角线上棋子数目,满足在同一左下对角线上的条件是横纵坐标之和相等,所以传入参数是横纵坐标之和
numChess(mapLeft, x + y);
// 计算右下对角线上棋子数目,满足在同一右下对角线上的条件是横纵坐标之差相等,所以传入参数是横纵坐标之差
numChess(mapRight, y - x);
}
// 计算每行有多少次攻击
int numRow = numAttack(mapRow);
// 计算每列有多少次攻击
int numCol = numAttack(mapCol);
// 计算左下对角线上攻击次数
int numLeft = numAttack(mapLeft);
// 计算右下对角线上攻击次数
int numRight = numAttack(mapRight);
System.out.println(numRow + numCol + numLeft + numRight);
}
} // 计算每行、每列或对角线上的棋子数目
public static void numChess(HashMap<Integer, Integer> map, int key) {
if (map.containsKey(key)) {
map.put(key, map.get(key) + 1);
} else {
map.put(key, 1);
}
} // 计算每行、每列或对角线上的攻击次数
public static int numAttack(HashMap<Integer, Integer> map) {
Iterator iter = map.entrySet().iterator();
int count = 0;
while (iter.hasNext()) {
Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) iter.next();
Integer val = entry.getValue();
if (val >= 2) {
count = count + val * (val - 1) / 2;
}
}
return count;
}
}

QueenAttack的更多相关文章

随机推荐

  1. [ SNOI 2013 ] Quare

    Description 题目链接 求一张无向带权图的边双连通生成子图的最小代价. Solution 核心的思路是,一个点双连通分量肯定是一堆环的并. 考虑增量地构造这个边双连通图,每次把一个环并进去, ...

  2. Sql Server RowNumber和表变量分页性能优化小计

    直接让代码了,对比看看就了解了 当然,这种情况比较适合提取字段较多的情况,要酌情而定 性能较差的: WITH #temp AS                       (              ...

  3. 洛谷P1724 东风谷早苗

    题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重).早苗的 ...

  4. ABAP和XML数据格式互相转换的两种方式

    ABAP和XML数据格式互相转换是广大开发人员经常遇到的需求.本文介绍两种方式. 1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_x ...

  5. Python3基础教程(十七)—— Virtualenv

    虚拟的 Python 环境(简称 venv) 是一个能帮助你在本地目录安装不同版本的 Python 模块的 Python 环境,你可以不再需要在你系统中安装所有东西就能开发并测试你的代码. 安装Vir ...

  6. k8s集群之master节点部署

    apiserver的部署 api-server的部署脚本 [root@mast-1 k8s]# cat apiserver.sh #!/bin/bash MASTER_ADDRESS=$1 主节点IP ...

  7. Zend studio 修改编码格式

    一.临时修改编码格式 edit -> Set Encoding... -> Other(选择) 二.修改软件默认编码格式

  8. Hibernate-04 延迟加载

    学习任务 延迟加载 Open Session In View模式 延迟加载 延迟加载(lazy load懒加载)是在真正需要数据时才执行SQL语句进行查询,避免了无谓的性能开销. 延迟加载策略的设置分 ...

  9. packet capture

    1.下载地址:https://www.coolapk.com/apk/app.greyshirts.sslcapture

  10. Java之字符,字符串替换

    /** 4. 字符串的替换操作 1. String replace(char oldChar,char newChar) //将新字符替换旧字符 3. String replaceFirst(Stri ...