JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
示例如下
至少需要九个元素:"A","B","C","D","E","F","G","H","I"
我们打印一个30*15的二维数组
刚好限制每一个元素出现50次
I D H A C F E G B E F C B I A
G A E D H I B F H G D G H C E
D F I B C A C G D B I A E F H
A H C G I D B E F E H G B C D
F I A F C A G I H D B E A I F
D E H G B E C A F I G H D C B
F B C I D H G E G A E C I A H
D H F B F C I A B D G H E D I
C E A G H B F C E F I B G A F
D G I B A C D H B G E D H C I
E A F C H F E G I D A B G A E
I C H D B G C F E H F D I B C
A D E F H A I G B C A H G D E
I F B A C G F H E I D B A H B
D G I E F B C D G A H I E C F
H C B G D I F E F B D A G I H
A E F C E H B C I G I H D A C
F G B D A C E F D B E A G I H
C H I F B D A G E F D I B E G
A G C H I F C D H B E A H D B
E I F A G B I G C A C F E A H
D B G D I F E H F I E B C G D
A C H B A H D I E G C F D B A
F I E C G B E H C D A G H F I
D H G I F C A B E F E B I G D
A C A H G B D F C H I F E C A
I H G B E C A B D F G D H I E
A D C H I F E G C B I A G B D
E H F E A C B D F H G H I E G
C A D B I F H C G I F E B A D
A_50 B_50 C_50 D_50 E_50 F_50 G_50 H_50 I_50
代码如下:
package com.lc.array;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap; /**
* 生成数组
* @author Cheng
*/
public class MatrixManage {
private Integer hight = 30;
private Integer wide = 15;
private Integer max = 50;
/** 每个元素出现的个数 **/
private TreeMap<String, Integer> keyNumMap = new TreeMap<>();
/** 目标数组 **/
private String[][] arr = new String[hight][wide];
/** 每个点 可使用的元素集合 **/
private Map<String,Set<String>> pointMap = new TreeMap<>(); public MatrixManage(String[] keys, Integer hight, Integer wide, Integer max) { if((hight*wide)>max*(keys.length)){
System.out.println("二逼,("+hight+"*" + wide + ")大于("+max+"*"+keys.length+")了,还玩毛");
return;
} this.hight = hight;
this.wide = wide;
this.max = max;
this.arr = new String[hight][wide]; for(String key :keys){
keyNumMap.put(key, 0);
}
} private void addKeyNumMap(String key){
keyNumMap.put(key, keyNumMap.get(key)+1);
} private void subtractKeyNumMap(String key){
keyNumMap.put(key, keyNumMap.get(key)-1);
} public static void main(String[] args) {
MatrixManage entity = new MatrixManage(new String[]{"A","B","C","D","E","F","G","H","I"},30,15,50);
entity.print();
} private void print() { for(int i=0;i<hight;i++){ for(int j=0;j<wide;j++){ while(true){ String pointKey = i + "_" + j;//点的key if(pointMap.containsKey(pointKey)){// 是否存储过该点 Set<String> pointSet = pointMap.get(pointKey);//获取该点可用的元素集合 subtractKeyNumMap(arr[i][j]); //更新元素的数量 pointSet.remove(arr[i][j]); //删除目前的元素 if(pointSet.isEmpty()){//该点没有可用的元素 pointMap.remove(pointKey);//删除该点、后退 if(j==0){
i--;
j=wide-1;
}else{
j--;
} }else{ TreeMap<Integer, List<String>> usableMap = getUsableMap(pointSet, false); if(usableMap.isEmpty()){//该点没有可用的元素 pointMap.remove(pointKey);//删除该点、后退 arr[i][j]=null;
if(j==0){
i--;
j=wide-1;
}else{
j--;
}
}else{
arr[i][j] = getKey(usableMap);
break;
}
} }else{ Set<String> set = getRoundSet(i, j);//(右上方4个)环绕的数组集合 TreeMap<Integer, List<String>> usableMap = getUsableMap(set, true); if(usableMap.isEmpty()){ if(j==0){
i--;
j=wide-1;
}else{
j--;
} }else{ Set<String> tempSet = new HashSet<>();
for(List<String> l:usableMap.values()){
tempSet.addAll(l);
} arr[i][j] = getKey(usableMap); tempSet.remove(arr[i][j]);
pointMap.put(pointKey, tempSet);
break;
}
}
} //修改元素的数量
addKeyNumMap(arr[i][j]);
}
}
printArr();
printKeyNum();
} /**
* 获取key
* @param usableMap
* @return
*/
private String getKey(TreeMap<Integer, List<String>> usableMap) {
Map.Entry<Integer,List<String>> entry = usableMap.firstEntry();
Random random = new Random();
int s = random.nextInt(entry.getValue().size());
return entry.getValue().get(s);
} /**
* 获取可用集合
* @param treeMap
* @param set
* @param b 1、true set包含 2、 false set不包含
* @return
*/
private TreeMap<Integer, List<String>> getUsableMap(Set<String> set,boolean b) {
TreeMap<Integer,List<String>> usableMap = new TreeMap<>();
for(Map.Entry<String, Integer> entry:keyNumMap.entrySet()){
if(entry.getValue() < max){
if((b==true && !set.contains(entry.getKey())) || (b==false && set.contains(entry.getKey()))){
if(usableMap.get(entry.getValue())==null){
usableMap.put(entry.getValue(),new ArrayList<>());
}
usableMap.get(entry.getValue()).add(entry.getKey());
}
}
}
return usableMap;
} /**
* 获取周围的元素集合
* @param i
* @param j
* @return
*/
private Set<String> getRoundSet(int i, int j) {
Set<String> set = new HashSet<>();
for(int x=1;x>=0;x--){
if((i-x)>=0){
for(int y=-1;y<2;y++){ if(x==0 && y==0){
break;
} if((j+y)>=0 && (j+y)<wide){
set.add(arr[i-x][j+y]);
}
}
}
}
return set;
} /**
* 打印数组
*/
private void printArr() {
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
} /**
* 打印数组数
*/
private void printKeyNum() {
for(Map.Entry<String, Integer> entry:keyNumMap.entrySet()){
System.out.print(entry.getKey()+"_"+entry.getValue()+"\t");
}
} }
注:支持后退操作,解决了不符合条件的情况
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数的更多相关文章
- java例题_29 二维数组问题,并输出对角线之和
1 /*29 [程序 29 求矩阵对角线之和] 2 题目:求一个 3*3 矩阵对角线元素之和 3 程序分析:利用双重 for 循环控制输入二维数组,再将 a[i][i]累加后输出. 4 */ 5 6 ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- Java中的二维数组
Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空 ...
- java学习之二维数组
java当中的二维数组,存储一组比较特殊的对象.他存储一个数组,同时存储的数组当中又存储着元素. java二维数组的声明方式一: class Arr2Demo { public static void ...
- Java生成艺术二维码也可以很简单
原文点击: Quick-Media Java生成艺术二维码也可以很简单 现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个 logo,或者将二维码嵌在一张特定的背景中(比如微 ...
- java基础之二维数组-杨辉三角
首先呢你要知道什么是杨辉三角? 答:杨辉三角,是二项式系数在三角形中的一种几何排列. 简单的说一下就是两个未知数和的幂次方运算后的系数问题,比如(x+y)的平方=x的平方+2xy+y的平方,这样系数就 ...
- Java基础教程——二维数组
二维数组 Java里的二维数组其实是数组的数组,即每个数组元素都是一个数组. 每个数组的长度不要求一致,但最好一致. // 同样有两种风格的定义方法 int[][] _arr21_推荐 = { { 1 ...
- Java一维与二维数组的拷贝与排序
Java一维与二维数组的拷贝与排序 目录 Java一维与二维数组的拷贝与排序 Arrays.sort() 一维数组升序排序 二维数组按行升序排序 二维数组按列升序排序 Java中的数组 Java中数组 ...
- [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组
13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...
随机推荐
- C++基础概述
阅读Android源码需要对C++基础语法有一定的认识,借此对C++做一个简单的语法认知. 1.数据类型 类型 关键字 布尔型 bool 字符型 char 整型 int 浮点型 float 双浮点型 ...
- git 入门教程之github 教程
github 教程 github 是一个基于 git 的代码托管平台,是平时工作学习的好帮手,学会如何用好 github 网站能够帮助我们更好分享代码或者与其他开发人员合作. 注册 github 账号 ...
- mac 全角/半角标点符号切换
快捷键:option+shift+H 背景是这样的,前段时间sublimeText新装了HTML/CSS/JS Prittify,JS代码格式化的快捷键是:command+shift+H. 记性有点差 ...
- EOS之记事本智能合约
EOS记事本智能合约 本次分享的内容是一个记事本合约,调用合约中的写入动作可以将文本和作者保存到数据库中,通过记事本合约来学习EOS智能合约数据存储当中的主键自增. 合约动作 写入动作 记事本合约必须 ...
- asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...
- Python语法的转义字符
Python语法的转义字符 转义字符 说 明 \ 续行符 \n 换行符 \0 空 \t 水平制表符,用于横向跳到下一制表位 \'' 双引号 \' 单引号 \\ 一个反斜杠 \f 换页 \0dd 八进 ...
- SQL SERVER的锁机制
SQL SERVER的锁机制(一)——概述(锁的种类与范围) SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源) SQL SERVER的锁机制(三)——概述(锁与事务隔离级别) ...
- realloc 用方法
realloc 用方法 void* realloc(void*, n) 根据n的大小,如果n比较小,就沿用原来的内存地址(也就是返回的地址就是原来的地址),在原来地址的内存空间的最后面,加上n大小的内 ...
- Dockfile制作镜像
讲一个简单的案例 @哈希码用来校验,这样子会安全 MAINTANIER可能将会被LABEL代替,仅仅说说明一下镜像信息罢了. 1.首先是我们创建一个镜像 [root@ELK-chaofeng08 ~] ...
- python基本数据类型之------列表
一.列表----list 列表是有序的,列表元素可以被修改 =================list之灰魔法================ 1.列表格式: 中括号括起来, 逗号分隔每个元素, 列表 ...