QueenAttack

问题分析:
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的更多相关文章
随机推荐
- OCP 11g 第一章练习
练习 1-1 研究所在环境的DBMS 这是一个书面练习,没有具体的解决方案. 确定自己所在环境使用的应用程序, 应用服务器 , 和数据库. 然后集中精力研究数据库, 体验一下数据库的规模和忙碌程度. ...
- mysql中的 enum (枚举)
mysql enum是指字段的类型 表示枚举类型 mysql> alter table student add adders enum("sichuang","sh ...
- SpringBoot集成FastDFS+Nginx整合基于Token的防盗链
为什么要用SpringBoot? SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- 【jQuery】uploadify,实际开发案例【选择完文件点击上传才上传】
----------------------------------------------------------------------------------js部分:------------- ...
- 使用jave2将音频wav转换成mp3格式
最近需要用到语音合成功能,网上查阅了一番,发现可以使用腾讯云的语音合成API来完成这个功能,但是腾讯云的api返回的是wav格式的音频文件,这个格式的文件有些不通用,因此需要转换成mp3格式的文件. ...
- 第4节 hive调优:2、数据倾斜
数据的倾斜: 主要就是合理的控制我们的map个数以及reduce个数 第一个问题:maptask的个数怎么定的???与我们文件的block块相关,默认一个block块就是对应一个maptask 第二个 ...
- Java中的类加载器--Class loader
学习一下Java中的类加载器,这个是比较底层的东西,好好学习.理解一下. 一.类加载器的介绍 1.类加载器:就是加载类的工具,在java程序中用到一个类,java虚拟机首先要把这个类的字节码加载到内 ...
- iOS 6 的 Smart App Banners 介绍和使用
iOS 6 的 Smart App Banners 介绍和使用 Denis 留言: 10 浏览:4890 文章目录[隐藏] 什么是 Smart App Banners 在你的网站添加 Smart Ap ...
- 「 HDOJ P3887 」 Counting Offspring
翻译 题目描述 给你一棵树,和它的树根 $P$,并且节点从 $1\rightarrow n$ 编号,现在定义 $f(i)$ 为 $i$ 的子树中,节点编号小于 $i$ 的节点的个数. 输入格式 有多组 ...
- luogu P1407 稳定婚姻-tarjan
题目背景 原<工资>重题请做2397 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有 ...