程序要求:随机生成n*n的矩阵,各行各列只能有一个1,其余为0数,即相同下标中只能有一个1,其余都是0;类似于单位矩阵。
例如:n=5
01000
10000
00100
00010
00001
算法思想:利用0-1随机数生成N*N的矩阵,对每行每列进行累加求和,求和的结果放在两个一维数组中,再对两个数组中所有的数进行判断是否为1,是则符合要求,否则继续随机生成。
代码如下:
import java.util.Random;
import java.util.Scanner;
public class practice02 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);//创建一个键盘扫描类对象
System.out.print("请您输入维数n:");
int n = input.nextInt();
Random random = new Random();
int arr[][] = new int[n][n];
int temp;
int h = 0;
int l = 0;
int hang[] =new int[n];
int lie[] =new int[n];
int i = 0;
while (i < n) {
i = 0;
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
temp = random.nextInt(2);
arr[j][k] = temp;
}
}
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
h += arr[j][k];
l += arr[k][j];
}
hang[j] = h;
lie[j] = l;
h = 0;
l = 0;
}
for (int j = 0; j < n; j++)
{
if (hang[j]==1&&lie[j]==1)
{
i++;
}
}
if (i==n){
for (int s = 0; s < n; s++) {
for (int k = 0; k < n; k++) {
System.out.print(arr[s][k]);
}
System.out.println();
}
}
}
}
}
运行结果:
总结:此程序的随机性较大,需要浪费巨大的运行空间,当维数较多时,则运行时间较长。如有更好的算法,欢迎吐槽交流,既然来了就点个赞呗~~~