Как добиться обмена массивами с двумя столбцами?

#java #arrays

#java #массивы

Вопрос:

Мы представляем Судоку в виде двумерного массива. Если вы хотите добиться того, чтобы два столбца в одном стеке поменялись местами, нам нужно симметрично поменять местами столбцы двумерного массива. Но в коде учителя почему строка массива обменивается? И результат правильный.

 private void permutateColumns(int a, int b) {
    if(a > 0 amp;amp; a < 10 amp;amp; b > 0 amp;amp; b < 10) {
        int[] array = field[a-1];
        field[a-1] = field[b-1];
        field[b-1] = array;
    }
}
 

весь код

 package ubung;

import java.util.Random;
//-------------------------------------------------------------- a)
public class Sudoku {

    final int n = 3;
    final int gridsize = n*n;   
    int[][] field = new int[gridsize][gridsize];

    Random random = new Random();

    public Sudoku() {
        int[] firstRow = {1,2,3,4,5,6,7,8,9};
        //h):  int[] firstRow = randomRow();
        for (int i = 0; i < gridsize; i  )
            for (int j = 0; j < gridsize; j  )
                field[i][j] = (i*n   i/n   j) % gridsize   1;
                //h):  field[i][j] = firstRow[(i*n   i/n   j) % gridsize];
        System.out.println(this);
    }

    //------------------------------------------------------------- g)
    public Sudoku(int permutationCount) {
        this();
        randomPermutation(permutationCount);
    }   

    //-------------------------------------------------------------- b) 
    /**Die Methode gibt ein Sudoku-Objekt als einen String zurueck
     * @return  der String eines Sudoku-Objektes
     */
    public String toString() {
        String str = line(25);

        for(int i = 0; i < 9; i  ){
            str  = "|";
            for(int j = 0; j < 9; j  ){
                str  = " "   get(i,j);
                if(j == 2 || j == 5 || j == 8)
                    str  = " |";
            }
            str  = "n";
            if(i == 2 || i == 5 || i == 8){
                str  = line(25);
            }
        }
        return str;
    }








    /**
    * Getter for single entries
    */
    private String get(int i, int j) {
        if(i < 0 || i > gridsize   1 || j < 0 || j > gridsize   1) {
            return " ";
        }
        int m = field[i][j];
        if(m == 0)
            return " ";
        return "" m;
    }

    private String line(int n){
        String str = "";
        for(int i = 0; i < n; i  )
            str  = "-";
        return str "n";
    }

    //-------------------------------------------------------------- c)
    /**
    * Two rows in one band are swapped. This produces 3!^3 as much solutions. ?????????????????????????
    */
    private void permutateRows(int a, int b) {
        if(a > 0 amp;amp; a < 10 amp;amp; b > 0 amp;amp; b < 10) {
            for(int i = 0; i < gridsize; i  ) {
                int temp = field[i][a-1];
                field[i][a-1] = field[i][b-1];
                field[i][b-1] = temp;
            }
        }
    }

    /**
    * Two columns in one stack are swapped. This produces 3!^3 as much solutions. ????????????????????
    */
    private void permutateColumns(int a, int b) {
        if(a > 0 amp;amp; a < 10 amp;amp; b > 0 amp;amp; b < 10) {
            int[] array = field[a-1];
            field[a-1] = field[b-1];
            field[b-1] = array;
        }
    }




    //-------------------------------------------------------------- d)
    /**
    * Two stacks are swapped. This produces 3! as much solutions.
    */
    private void permutateStacks(int a, int b) {
        if(b < a) {
            permutateStacks(b,a);
            return;
        }

        if(a == 1 amp;amp; b == 2) {
            permutateColumns(1,4);
            permutateColumns(2,5);
            permutateColumns(3,6);
        }
        else if(a == 1 amp;amp; b == 3) {
            permutateColumns(1,7);
            permutateColumns(2,8);
            permutateColumns(3,9);          
        }
        else if(a == 2 amp;amp; b == 3) {
            permutateColumns(4,7);
            permutateColumns(5,8);
            permutateColumns(6,9);          
        }
    }

    /**
    * Two bands are swapped. This produces 3! as much solutions.
    */  
    private void permutateBands(int a, int b) {
        if(b < a) {
            permutateBands(b,a);
            return;
        }

        if(a == 1 amp;amp; b == 2) {
            permutateRows(1,4);
            permutateRows(2,5);
            permutateRows(3,6);
        }
        else if(a == 1 amp;amp; b == 3) {
            permutateRows(1,7);
            permutateRows(2,8);
            permutateRows(3,9);         
        }
        else if(a == 2 amp;amp; b == 3) {
            permutateRows(4,7);
            permutateRows(5,8);
            permutateRows(6,9);         
        }
    }



    //-------------------------------------------------------------- e)
    /**
    * Two rows in one band are swapped. This produces 3!^3 as much solutions.
    */
    private void permutateRows() {
        int block = random.nextInt(3);
        int a = random.nextInt(3) 1;
        int b = random.nextInt(3) 1;
        permutateRows(a block*3,b block*3);
    }

    /**
    * Two columns in one stack are swapped. This produces 3!^3 as much solutions.
    */
    private void permutateColumns() {
        int block = random.nextInt(3);
        int a = random.nextInt(3) 1;
        int b = random.nextInt(3) 1;
        permutateColumns(a block*3,b block*3);
    }

    private void permutateStacks() {
        int a = random.nextInt(3) 1;
        int b = random.nextInt(3) 1;
        permutateStacks(a,b);
    }

    private void permutateBands() {
        int a = random.nextInt(3) 1;
        int b = random.nextInt(3) 1;
        permutateBands(a,b);
    }
    //-------------------------------------------------------------- f) 
    /**
    * The matrix is transposed. This produces double as much solutions.
    */  
    private void transpose() {
        for (int i = 0; i < gridsize; i  )
            for (int j = 0; j < i; j  ) {
                int temp = field[j][i];
                field[j][i] = field[i][j];
                field[i][j] = temp;
            }
    }
    //--------------------------------------------------------------  g)
    private void randomPermutation(){
        switch(random.nextInt(5)) {
            case 0: permutateRows(); break;
            case 1: permutateColumns(); break;
            case 2: permutateStacks(); break;
            case 3: permutateBands(); break;
            case 4: transpose();
            default:            
        }
    }

    private void randomPermutation(int n){
        for(int i = 0; i < n; i  )
            randomPermutation();
    }

    //--------------------------------------------------------------  h)
    /**
    * Returns random row of digits. Used to relabel digits in the initial matrix
    * This yields 9! as much solutions.
    */ 
    private int[] randomRow(){
        boolean[] used = new boolean[gridsize];
        int[] row = new int[gridsize];
        for(int i = 0; i < gridsize; i  ) {
            int candidate = random.nextInt(gridsize);
            if(!used[candidate]){
                used[candidate] = true;
                row[i] = candidate 1;
            }
            else {
                i--;
            }
        }
        return row;
    }

    //--------------------------------------------------------------  i)    
    private void hide(int n) {
        if(n < 0)
            n = 0;
        if(n > 81)
            n = 81;

        for(int k = 0; k < n; k  ) {
            int i = random.nextInt(9);   //在方法调用返回介于0(含)和n(不含)伪随机,均匀分布的int值。
            int j = random.nextInt(9);
            if(field[i][j] != 0)
                field[i][j] = 0;
            else
                k--;
        }
    }

    /*****************************************/       //gegeben
    public static void main(String[] args){
        Sudoku s = new Sudoku(100000);
        System.out.println(s);
        s.hide(50);
        System.out.println(s);
    }   
}
 

Мы представляем Судоку в виде двумерного массива. Если вы хотите добиться того, чтобы два столбца в одном стеке поменялись местами, нам нужно симметрично поменять местами столбцы двумерного массива. Но в коде учителя почему строка массива обменивается? И результат правильный.

Ответ №1:

Если мы обозначим индексы 2D-массива как field[x][y] , предоставленный код решения будет использоваться x как индекс столбца и y как индекс строки. Важно отметить, что предоставленный метод не является единственно правильным решением. Было бы так же правильно реализовать x как индекс строки y , так и индекс столбца, если методы были реализованы правильно.