我正在研究java,我必须生成M-by-N矩阵的所有可能模式(组合),这样在同一行中不应该只有一个1,同一列可能包含多于一个单个1,以3 * 3矩阵为例,生成的矩阵应如下所示:
1 0 0
1 0 0
1 0 0
0 1 0
1 0 0
1 0 0
0 0 1
1 0 0
1 0 0
1 0 0
0 1 0
1 0 0
1 0 0
0 0 1
1 0 0
1 0 0
1 0 0
0 1 0
1 0 0
1 0 0
0 0 1
0 1 0
0 1 0
0 1 0
1 0 0
0 1 0
0 1 0
0 0 1
0 1 0
0 1 0
0 1 0
1 0 0
0 1 0
0 1 0
0 0 1
0 1 0
.....等等。
正如我已经说过,progrom应该是灵活的,可以为M和N的任何值生成所有这些可能的模式。
请帮帮我..
谢谢!
答案 0 :(得分:0)
这是一个解决方案。 ideone.com demo
我打赌它可以用一半的行数来完成。
public static Set<int[][]> chooseFrom(List<int[]> choices, int choose) {
Set<int[][]> results = new HashSet<int[][]>();
if (choose == 1) {
for (int[] choice : choices)
results.add(new int[][] { choice });
} else {
for (int[] choice : choices) {
for (int[][] submatrix : chooseFrom(choices, choose - 1)) {
int[][] matrix = new int[choose][];
matrix[0] = choice;
for (int r = 1; r < choose; r++)
matrix[r] = submatrix[r-1];
results.add(matrix);
}
}
}
return results;
}
public static Set<int[][]> matrices(int M, int N) {
List<int[]> possibleRows = new ArrayList<int[]>();
for (int i = 0; i < N; i++) {
int[] row = new int[N];
row[i] = 1;
possibleRows.add(row);
}
return chooseFrom(possibleRows, M);
}
2x3案例的输出:
[ 0 0 1 ]
[ 0 1 0 ]
[ 1 0 0 ]
[ 0 0 1 ]
[ 0 0 1 ]
[ 0 0 1 ]
[ 0 0 1 ]
[ 1 0 0 ]
[ 0 1 0 ]
[ 1 0 0 ]
[ 0 1 0 ]
[ 0 1 0 ]
[ 1 0 0 ]
[ 1 0 0 ]
[ 0 1 0 ]
[ 0 0 1 ]
[ 1 0 0 ]
[ 0 1 0 ]
答案 1 :(得分:0)
我将它作为三个1维数组进行,其中有逻辑检查以查看给定数组是否可接受。可接受的,我的意思是包含不超过一个1.我然后保存此配置,因为列无关紧要。
完成后,我会遍历所有可能的有效数组,并使用for循环为每个有问题的数组打印出来。我建议创建一个类来封装每组数组,并编写一些方法来遍历并正确打印它们。然后我会将所有这些对象放在生成链接列表中,然后遍历该列表以在生成后打印所有可能的选项。
答案 2 :(得分:0)
正如您所看到的那样,每行最多只有n个可能性。因此,为了枚举所有可能的矩阵,您只需遍历col索引并在该col中放置1。正如您想要的所有行和所有组合一样,您现在需要对所有行进行递归,而volia:您有解决方案。
(你的问题甚至没有暗示你已经尝试过的东西,也没有暗示你被困住的地方,所以答案非常不明确。)
答案 3 :(得分:0)
import java.util.Arrays;
public class MatrixPatternGenerator {
public static void main(String[] args) {
int M = Integer.parseInt(args[0]);
int N = Integer.parseInt(args[1]);
int[] rows = new int[M];
Arrays.fill(rows, 0);
System.out.println("Matrix number-> 1");
printMatrix(M, N, rows);
int cursor = M-1;
while (true){
if (rows[cursor]==N-1){
if (cursor==0)
break;
rows[cursor]=0;
cursor--;
continue;
}
rows[cursor]++;
printMatrix(M, N, rows);
if (cursor<M-1){
cursor = M-1;
}
}
}
public static void printMatrix(int M, int N, int[] rows){
for (int i=0 ; i<M ; i++ ){
for (int j=0 ; j<rows[i] ; j++){
System.out.print(" 0");
}
System.out.print(" 1");
for (int j=rows[i]+1 ; j<N ; j++){
System.out.print(" 0");
}
System.out.println();
}
System.out.println();
}
}
答案 4 :(得分:0)
唔... 如果我更正,这与置换算法类似。 看看你是否有3x3所以它是相同的,找到123的排列 所以排列会像
111
112
113
121
131
...etc
并将其转换/显示为数组
111
will be
100
100
100
112
will be
100
100
010
... etc
希望这会有所帮助