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的更多相关文章
随机推荐
- 小程序setData,视图层没有跟新
如果你完全符合微信介绍的setData使用说明的情况下,发现视图层没有更新,你可以看看我的这种情况. 使用setData的时候,修改的是data中一个对象的值,然后这个对象里面第一层不能含有 numb ...
- new操作符具体干了什么
function Func(){ }; var newFunc=new Func (); new共经过了4个阶段 1.创建一个空对象 var obj=new Object(); 2.设置原型链 把 o ...
- function calling convention
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=31 February 19, 2013 function calling c ...
- 第十三周翻译:SQL Server安全级别1:SQL Server安全性概述
SQL Server安全级别1:SQL Server安全性概述 源自:Stairway to SQL Server Security Level 1: Overview of SQL Server S ...
- css-test
transition-content See the Pen NLOgVR by nakata139@gmail.com (@deepblue1982) on CodePen.
- Idea maven项目不能新建package和class的解决方法
如下图,用IDEA新建的maven项目不能新建package,class等 原因是:这里的java文件夹是普通文件夹,要设置为Sources Root.(如下图) 就可以了(见下图)
- Django的架构
简介 Django继承并简化了MVC架构.MVC中的Controller部分基本全由Django完成.View部分被分割成两部分,即:负责HTML渲染的模板和负责显示逻辑的视图.所以Django又被称 ...
- 基础数据类型(set集合)
认识集合 由一个或多个确定的元素所构成的整体叫做集合. 集合中的元素有三个特征: 1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同.例如:集合A={1,a},则a不能等于1) ...
- C-基础:memcpy、memset、memmove、memcmp、memchr
一,原型 void * memcpy ( void * destination, const void * source, size_t num ); 功能:将以source作为起始地址的数据复制nu ...
- windows cmd 模仿电影黑客
1.win+R 2.输入cmd 3.按F11进入全屏 4.color a 改变颜色为绿色(可能看起来秀一点) 5.dir/s 查看所有文件,就跑起来了,看起来很酷,但是在懂得人眼里,没什么的(所以只能 ...