gpt4 book ai didi

java - 用随机数填充矩阵,垂直或水平不重复

转载 作者:搜寻专家 更新时间:2023-11-01 01:59:54 25 4
gpt4 key购买 nike

这更像是一个逻辑问题。问题是:

我需要用数字 (1-9) 填充一个矩阵,这样:

  1. 任何数字都不应在行中重复
  2. 数字不应在列中重复
  3. 矩阵可以是3X3到8X8
  4. 矩阵应包含不按特定顺序排列的随机数

我不擅长把我试过的逻辑放在下面:

public class RandMatrix {
static int max=8;
static ArrayList<Integer> numbers=new ArrayList<>();
static int[][] arr=new int[max][max];
public static void main(String[] a){
// To fill number
for (int i = 1; i <=9; i++) {
numbers.add(i);
}
// Shuffle number
Collections.shuffle(numbers);
call();
}

public static void call(){
for (int i = 0; i < max; i++) {
for (int j = 0; j <max ; j++) {
for (int k = 0; k <max ; k++) {
int num=numbers.get(k);
if(!isExist(num,i,j)){
arr[i][j]=num;
break;
}
}
}
Collections.shuffle(numbers);
}
}

private static boolean isExist(int num,int row, int col){
for (int i = row; i >=0; i--) {
if(arr[i][col]==num){
return true;
}
}
for (int j = col; j >=0; j--) {
if(arr[row][j]==num){
return true;
}
}
return false;
}
}

当我打印二维数组时,我在某些地方看到仍然有 0 作为值。好像我的代码中断了。在某些时候,没有剩下可以填充的随机数。输出是这样的:

enter image description here

我知道我的算法不对,我只是找不到完成它的方法。我能得到一些帮助吗?

最佳答案

我刚才保存并修改了一些代码,以备下次需要时使用。我想这是给你的 ;)

import java.util.Arrays;
import java.util.Random;

class Test {
public static void main(String[] args){
int size = 9;

int[][] matrix= new int[size][];
matrix[0] = MatrixOps.createOrderedArray(size, 1);

for(int x=0; x < size; x++) {
matrix[x] = MatrixOps.createOrderedArray(size, 1);
do {
MatrixOps.shuffle(matrix[x]);
} while(! MatrixOps.compare2DArray(matrix[x], matrix, 0, x));
}
MatrixOps.print(matrix);
}
}

class MatrixOps {

public static void shuffle(int[] arr){
Random random = new Random();
for(int x = 0; x < arr.length; x++)
swap(arr, x, random.nextInt(arr.length));
}

public static int[] createOrderedArray(int size, int startValue) {
int[] num = new int[size];
for (int x = 0; x < num.length; x++)
num[x] = x + startValue;
return num;
}

public static boolean compare2DArray(int[] arr1, int[][] arr2, int begin, int end) {
for (int x = begin; x < end; x++)
if (!compareArray(arr1, arr2[x]))
return false;
return true;
}

// https://stackoverflow.com/questions/19648240/java-best-way-to-print-2d-array/41533179#41533179
public static void print(int[][] array) {
for (int[] x: array) {
for (int y: x) {
System.out.print(y + " ");
}
System.out.println();
}
}

private static boolean compareArray(int[] arr1, int[] arr2){
if(arr1.length != arr2.length)
return false;
for(int x=0; x<arr1.length; x++)
if(arr1[x] == arr2[x])
return false;
return true;
}

private static void swap(int[] arr, int a, int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}

示例输出:

5 1 7 2 3 8 9 4 6 
4 3 1 5 7 9 2 6 8
9 7 3 8 6 2 4 5 1
6 8 4 3 5 7 1 9 2
1 5 8 9 2 6 7 3 4
7 9 2 6 4 1 5 8 3
8 6 9 4 1 5 3 2 7
3 2 6 7 9 4 8 1 5
2 4 5 1 8 3 6 7 9

关于java - 用随机数填充矩阵,垂直或水平不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51943125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com