java编写在n*n的方格内所有行和列相加之和相等的程序,n为自己输入,自动生成一个n*n的数组

解决方案 »

  1.   

    public class Text{
    public static void main(String[] args){
    int[][] a = new int[100][100];
    int n = 5; for(int i=0;i<n;i++){
    int[] b = new int[n];
    randoms(b,n);
    for(int j=0;j<n;j++){
    a[i][j] = b[j];
    }

    for(int k=0;k<i;k++){
    for(int l=0;l<n;l++){
    if(a[i][l]==a[k][l]){
    int kk = (int)(Math.random()*n);
    int x = a[i][kk];
    a[i][kk] = a[i][l];
    a[i][l] = x;
    k=-1;
    break;
    }
    }
    }
    }
    for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
    System.out.print(a[i][j]+" ");
    }
    System.out.println();
    }
    }
    public static void randoms(int[] a,int x){
    for(int i=0;i<x;i++){
    while(true){
    boolean isC = true;
    a[i] = (int)(Math.random()*x+1);
    for(int j=0;j<i;j++){
    if(a[i]==a[j])
    isC = false;
    }
    if(isC)
    break;
    }
    }
    }
    }在网吧做的,比较吵,思路不是很清晰,你先看看结果对不,改变n的值可以改变矩阵大小,写的有点乱,明天我再想想吧,我要LOL了。
      

  2.   

    /*
    这个是9宫问题的扩展
    9宫算法
        3
      2   6
    1   5   9
      4   8
        7首先 延对角线左下到右上3个3个排列数据,每1次3个数排列的时候,开始位置偏移1个位置,得出一个菱形
    然后 把菱形转成正方形,以菱形的中间对角线456列位基准,
    把行列超越位置的数按中线(159,357是菱形的中线)反转到相应的位置,如图
           | 3 |   
    ---------------
      | 2 | 7 | 6 |
    ------------------
    1 | 9 | 5 | 1 | 9 |
    ------------------
      | 4 | 3 | 8 |   
    ------------------
          | 7 |
    得到正方形
      | 2 | 7 | 6 |
    ------------------
      | 9 | 5 | 1 | 
    ------------------
      | 4 | 3 | 8 | 
    就是结果
    此法适用于n为奇数情况,例子代码
    */
    public class Test {    
        public static void main(String[] args) throws Throwable {
            doMatrix(5);
        }    public static void doMatrix(int n) {
            if (n%2 == 0) n++; //保证n为奇数
            int strLen = String.valueOf(n*n).length();
            String format = String.format("%%%ds ", strLen);
            int[][] matrix = new int[n][n];
            for (int i=1, rs=n/2, cs=-n/2, r=rs, c=cs; i<=n*n; i++) {
                matrix[(r < 0) ? n+r : (r >= n ? r-n : r)][(c < 0) ? n+c : (c >= n ? c-n : c)] = i;
                r--;
                c++;
                if (i%n == 0) {
                    rs++;
                    cs++;
                    r = rs;
                    c = cs;
                }
            }
        
            int sum = 0;
            for (int i=0; i<n; i++) {
                for (int j=0; j<n; j++) {
                    System.out.printf(format, matrix[i][j]);
                    if (i == 0 ) {sum+=matrix[i][j];}
                }
                System.out.println();
            }
            System.out.printf("--------------------\n%d\n", sum);
        }
    }
      

  3.   

    public class Text {
    public static void main(String[] args) {
    int n = 5;
    int[][] a = new int[100][100];
    for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) {
    if (i == 0) {
    a[i][j] = j + 1;
    } else {
    if (j > 0) {
    a[i][j] = a[i - 1][j - 1];
    } else {
    a[i][j] = a[i - 1][n - 1];
    }
    }
    }
    }
    randoms(a,n);
    for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
    System.out.print(a[i][j]);
    }
    System.out.println();
    }
    }
    public static void randoms(int[][] a,int n){
    for(int i=0;i<n;i++){
    int x = (int)(Math.random()*n);
    int y = (int)(Math.random()*n);
    for(int j=0;j<n;j++){
    int num = a[j][x];
    a[j][x] = a[j][y];
    a[j][y] = num;
    }
    }
    for(int i=0;i<n;i++){
    int x = (int)(Math.random()*n);
    int y = (int)(Math.random()*n);
    for(int j=0;j<n;j++){
    int num = a[x][j];
    a[x][j] = a[y][j];
    a[y][j] = num;
    }
    }
    }
    }这是改良版,算法很简单,先在二维数组第一行按照1~n进行写入,然后每行依次按照前一行向后移动一位,就像:
    12345
    51234
    45123
    34512
    23451
    然后就随机移动一下行行列列的就OK了,也可以达到你说那个效果。