java不等长二维数组_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

代码如下:

packagecom.lc.array;importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Random;importjava.util.Set;importjava.util.TreeMap;/*** 生成数组

*@authorCheng*/

public classMatrixManage {private Integer hight = 30;private Integer wide = 15;private Integer max = 50;/**每个元素出现的个数 **/

private TreeMap keyNumMap = new TreeMap<>();/**目标数组 **/

private String[][] arr = newString[hight][wide];/**每个点 可使用的元素集合 **/

private Map> pointMap = new TreeMap<>();publicMatrixManage(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 = newString[hight][wide];for(String key :keys){

keyNumMap.put(key,0);

}

}private voidaddKeyNumMap(String key){

keyNumMap.put(key, keyNumMap.get(key)+1);

}private voidsubtractKeyNumMap(String key){

keyNumMap.put(key, keyNumMap.get(key)-1);

}public static voidmain(String[] args) {

MatrixManage entity= new MatrixManage(new String[]{"A","B","C","D","E","F","G","H","I"},30,15,50);

entity.print();

}private voidprint() {for(int i=0;i

String pointKey= i + "_" + j;//点的key

if(pointMap.containsKey(pointKey)){//是否存储过该点

Set 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> 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 set = getRoundSet(i, j);//(右上方4个)环绕的数组集合

TreeMap> usableMap = getUsableMap(set, true);if(usableMap.isEmpty()){if(j==0){

i--;

j=wide-1;

}else{

j--;

}

}else{

Set tempSet = new HashSet<>();for(Listl: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

*@paramusableMap

*@return

*/

private String getKey(TreeMap>usableMap) {

Map.Entry> entry =usableMap.firstEntry();

Random random= newRandom();int s =random.nextInt(entry.getValue().size());returnentry.getValue().get(s);

}/*** 获取可用集合

*@paramtreeMap

*@paramset

*@paramb 1、true set包含 2、 false set不包含

*@return

*/

private TreeMap> getUsableMap(Set set,booleanb) {

TreeMap> usableMap = new TreeMap<>();for(Map.Entryentry:keyNumMap.entrySet()){if(entry.getValue()

usableMap.put(entry.getValue(),new ArrayList<>());

}

usableMap.get(entry.getValue()).add(entry.getKey());

}

}

}returnusableMap;

}/*** 获取周围的元素集合

*@parami

*@paramj

*@return

*/

private Set getRoundSet(int i, intj) {

Set 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)

set.add(arr[i-x][j+y]);

}

}

}

}returnset;

}/*** 打印数组*/

private voidprintArr() {for(int i=0;i

System.out.print(arr[i][j]+"\t");

}

System.out.println();

}

}/*** 打印数组数*/

private voidprintKeyNum() {for(Map.Entryentry:keyNumMap.entrySet()){

System.out.print(entry.getKey()+"_"+entry.getValue()+"\t");

}

}

}

注:支持后退操作,解决了不符合条件的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值