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的更多相关文章
随机推荐
- 洛谷2017 5月月赛R1
我只想说面对这种难度的题目就是冲着20%的数据暴力... 分数:40+20+36.1+38+0+19 T1 签到题 III 题目背景 pj组选手zzq近日学会了求最大公约数的辗转相除法. 题目描述 类 ...
- 雪碧图(background-position)、overflow、title中的小图标、光标、rgb 和opacity 与rgba
一.background-position 雪碧图 我们的html和css中有三个属性可以向服务器发送请求:src url href 1.我们为什么使用雪碧图? 因为我们使用雪碧图之 ...
- 【学习笔记】HTML position(static、fixed、relative、absolute)
[本文转载] position的四个属性值:static.fixed.relative.absolute 下面分别讲述这四个属性:<div id="parent"> ...
- iOS开发中的HTML解析
在进行解析前,先将下面的第三方类添加到工程中: 添加以上三个类必须添加一个库,这个库是:libxml2.2.dylib. 还需要设置一些路径参数这个路径的设置,在 targets中,在build se ...
- Java Script 学习笔记(一)
示例如下: JavaScript-警告(alert 消息对话框) 我们在访问网站的时候,有时会突然弹出一个小窗口,上面写着一段提示信息文字.如果你不点击“确定”,就不能对网页做任何操作,这个小窗口就是 ...
- github 下载全部项目
从github下载资料过程中,有些项目含有子模块,有时通过git clone 或者下载zip方式项目可能会缺少文件,因此需要执行 git submodule update --init --recur ...
- 指针-AC自动机
大家都不喜欢指针,但是这个AC自动机仿佛不用不行…… 先引用我最喜欢的话:“AC自动机,不是自动AC的机器.” 如果写不好还可能一直WA AC自动机是KMP与Trie树的完美结合,适用于多字符串匹配, ...
- ignore-on-commit svn 更改文件后 默认不提交文件到服务器(服务器上已存在的文件)
不用那个忽略文件那个,那个功能是删除服务器的文件,然后本地还存在,不符合我的要求 我的要求是 服务器文件在,我不动,然后我改完了,和别人的不冲突,我也不覆盖别人的文件 主要就是默认不提交,这个很重要 ...
- JavaSE-27 JDBC
学习要点 JDBC 查询数据 添加数据 修改数据 删除数据 JDBC 1 JDBC的定义 JDBC是Java数据库连接技术的简称,提供连接和操作各种常用数据库的能力. 2 JDBC工作原理 3 ...
- Django考试系统(1)
好久没更过博客了,菜是原罪.毕业设计快做完了,第一次独立做的项目(考试系统),自己摸索着做的,以前学习的好多东西都用上了,但是也都忘了,完成设计的途中又一步步的捡起来了(不知道现在还记没记得).最近着 ...