矩阵模式生成

时间:2011-07-01 18:25:44

标签: java

你好

我正在研究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的任何值生成所有这些可能的模式。

请帮帮我..

谢谢!

5 个答案:

答案 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

希望这会有所帮助