自娱小程序--九宫格

package com.arvey.eventbank.crash;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class JiuGG {
/*
* 构建数据结构
* Map<1-5整数(亦做数值使用),两层嵌夽整型SET(两个数值,升序) key + sum(set) = 15
*/
Map<Integer,Set<Set<Integer>>> nine = new HashMap<Integer,Set<Set<Integer>>>();
// a+b = sum, both a and b (beginNum ... 9)
public Set<Integer> getSets(int sum,int beginNum){
boolean nullset = true;
Set<Integer> res=null;
//except sum-1
for(int x=beginNum;x<sum/2+1;x++){
if(x == 15-sum)
continue;
for(int m=9;m>sum/2;m--){
if(m == 15-sum) continue;
if(x+m == sum){
if(nullset){
res = new HashSet<Integer>();
res.add(x);
res.add(m);
nullset = false;
break;
}
}
if(!nullset)
break;
}
return res;
}
//firNum ( 1 ... 5)
public Set<Set<Integer>> getAllSetsByNum(int firNum){
Set<Set<Integer>> res = new HashSet<Set<Integer>>();
int div=(15-firNum)/2;
for(int i=1;i<=div;i++){
Set<Integer> aSet = getSets(15-firNum,i);
if(aSet != null)
res.add(aSet);
}
return res;
}
//get all groups, x+y+z = 15
public void initialNums(){
for(int i=1;i<=5;i++){
Set<Set<Integer>> aSet = getAllSetsByNum(i);
if( aSet !=null )
nine.put(i, aSet);
}
}
/***
* 九宫格特点(数字代表位置)
* 1 2 3
* 4 5 6
* 7 8 9
 *  5位置被使用四次,1+5+9 2+5+8 3+5+7 4+5+6
*  1,3,7,9位置被使用三次   1+2+3 1+4+7 1+5+9
 *  2,4,6,8位置被使用两次, 1+2+3 和 2+5+8 
*/
boolean isPos1379(Set<Set<Integer>> specialkey,Integer value){
boolean res = false;
for(Set<Integer> aset:specialkey){
if(aset.contains(Integer.valueOf( 10 - value))){
res = true;
break;
}
}
return res;
}
public void printJiuGG(){
/*确定5,1,2,3,4,7的位置上的数值,规则取Map里key最小的
* 位置5,只有5被使用四次,所以找出包涵Set最多的key就是5位置的元素
* 位置1,取key最小的,有3组数,不取有5的一组的两组,这五个数会放在,12347的位置
* 位置3,7, 在key = 1的嵌夽数据集中,找到另两相加等于10的数,一个放在3,另一个落在7
* 位置2,必须被引用两次的数据中,且不能在有5的一组数中
* 位置4, 另一组有两组数据且
*/
Set<Integer> keys = nine.keySet();//放入进有序,所以取第一个有三组数的key值,
int pos1 = -1;
Set<Set<Integer>> aSet = null;
for(Integer key:keys){
aSet = (Set<Set<Integer>>)nine.get(key);
if( aSet.size() == 3 ){
pos1 =  key;
break;
}
}
Set<Set<Integer>> pos1Set = (Set<Set<Integer>>)nine.get(pos1);
Set<Integer> pos123 = null;
Set<Integer> pos147 = null;
for(Set<Integer> as : pos1Set){
if(as.contains(Integer.valueOf(5)))
continue;
else if(pos123 == null)
pos123 = as;
else
pos147 = as;
}
//pos123中确定 位置2 3
int pos2 = -1,pos3 = -1;
for(Integer aInt:pos123){
if(isPos1379(pos1Set,aInt)){
pos3 = aInt;
} else
pos2 = aInt;
}
//pos147中确定 位置7 4
int pos4 = -1,pos7 = -1;
for(Integer aInt:pos147){
if(isPos1379(pos1Set,aInt)){
pos7 = aInt;
} else
pos4 = aInt;
}
System.out.println("Print the Result: 1-2-3 : "+pos1+"-"+pos2+"-"+pos3);
System.out.println("Print the Result: 4-5-6 : "+pos4+"-"+5+"-"+(10-pos4));
System.out.println("Print the Result: 7-8-9 : "+pos7+"-"+(10-pos2)+"-"+(10-pos1));
}
public Map<Integer,Set<Set<Integer>>> getNine(){
return nine;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JiuGG jiuGG = new JiuGG();
jiuGG.initialNums();
Set<Integer> keys = jiuGG.getNine().keySet();
for(Integer key:keys){
System.out.println("Key :"+key);
Set<Set<Integer>> sets = (Set<Set<Integer>>)jiuGG.getNine().get(key);
for(Set<Integer> ele:sets){
System.out.println(ele);
}
}
jiuGG.printJiuGG();
}
}
上一篇:ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测


下一篇:美计算机科学学者建议:加强青少年网络安全意识引导