java - 用随机数填充矩阵,垂直或水平不重复
问题描述
这更像是一个合乎逻辑的问题。问题是:
我需要用数字(1-9)填充一个矩阵,以便:
- 没有数字应该在行中重复
- 列中不应重复任何数字
- 矩阵可以从 3X3 到 8X8
- 矩阵应该包含不按特定顺序的随机数
我不擅长把我尝试过的逻辑放在下面:
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 作为 value 。好像我的代码坏了。在某些时候,没有可以填充的随机数了。输出类似于:
我知道我的算法不正确,我只是找不到方法来完成它。我能得到一些帮助吗?
解决方案
前段时间我已经保存并修改了一些代码,以便在需要其他时间时使用。我想这是给你的;)
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
推荐阅读
- mysql - 在特定列的仅具有空值的组中选择不同计数
- python - GitPython - 使用 ssh 密钥克隆 - 主机密钥验证失败
- python-3.x - 从另一个类中检索变量
- javascript - 如何在它们之间的 setTimeout 之后调用数组中的多个函数?
- python - Pandas:使用公式向前填充时间序列中的缺失值
- ionic-framework - 在 Ionic 3 应用程序中使用 Observable 和 HttpClient
- javascript - 理解异步和等待
- react-native - 在 setValue 之后 React-Native 动画无法正常工作
- python - 为什么 Pandas DataFrame 函数推断可以向下转换为 float32 的 float64
- c# - Google Play 商店编辑提交中“500 No individual errors”的原因