2017-09-12 6 views
1

以前の記事では、各行から数独行列の要素を削除する方法について説明しました。さて、私はSudoku行列から要素を一つずつ削除する方法を考えていますが、行と列ごとに削除します。私は、要素が行内で削除されたからの列インデックスを格納する配列を作成することを考えています。次に、次の行で、削除した番号が以前に格納された列インデックスにあるかどうかを確認するために、別の要素チェックを削除することを繰り返しました。私はそれが非常に効率的なアルゴリズムになるとは思わないが。数独行列の各行と列から1つのランダム要素を削除してください

効率的にそれを行うには、行メソッドから

public static void remove_Sud (int [][] S){ // Remove sudoku method 
    for(int i = 0; i < S.length; i++){ // For loop iterate through length of matrix array 
     int randomPosition = (int) Math.floor(Math.random() * S.length); //Random number between 0 and 2 
     S[i][randomPosition] = 0; // 0 or whatever you use to represent blank 
    } 

} 

Sudoku Matrix

+0

質問がありますか? – JensS

+0

数独行列の各行と列から1つの要素を削除するにはどうすればよいですか? – Alan

+0

私は以下の回答を投稿しました。 – Assafs

答えて

1

の要素を削除し、私は、インデックスの二つのアレイ(列に対して1つの行に1つ)を作成する各9 INT長い示唆。リストを使うよりも効率的です。

public static void removeSudoku(int[][] sudoku) { 
    Random rand = new Random(); 
    int[] cols = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; 
    int[] rows = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; 

    //We need to choose an index for each number 0-8 inclusive. 
    for (int i=0;i<9;i++) { 

     //get a random index on the column array for i 
     int randomInt = rand.nextInt(9); 
     //In case this random index is already populated - 
     //rand again until an empty spot is available. 
     while (cols[randomInt]!=-1) { 
     randomInt = rand.nextInt(9); 
     } 
     cols[randomInt] = i; 

     //Same thing for the rows - get a random index in the 
     //array for i, rand again if needed. 
     randomInt = rand.nextInt(9); 
     while (rows[randomInt]!=-1) { 
     randomInt = rand.nextInt(9); 
     } 
     rows[randomInt] = i; 
    } 

    //Now that we have the two arrays filled in with a random 
    //permutation of ints 0-8, we can use it to remove the 
    //elements from the sudoku. 
    for (int i=0;i<9;i++) { 
     sudoku[rows[i]][cols[i]] = 0; 
    } 
    } 

    //Just for printout 
    public static void printSoduku(int[][] sudoku) { 
    for (int i=0;i<9;i++) { 
     for(int j=0;j<9;j++) { 
     System.out.print(sudoku[i][j]+" "); 
     if (j==2 || j==5) { 
      System.out.print("|"); 
     } 
     } 
     System.out.println(); 
     if (i==2 || i==5) { 
     System.out.println("-------------------"); 
     } 
    } 
    } 

    public static void main(String[] args) throws IOException { 

    int[][] soduku = new int[][] {{1,2,3,4,5,6,7,8,9}, 
    {4,5,6,7,8,9,1,2,3},{7,8,9,1,2,3,4,5,6}, 
    {2,3,4,5,6,7,8,9,1},{5,6,7,8,9,1,2,3,4}, 
    {8,9,1,2,3,4,5,6,7},{3,4,5,6,7,8,9,1,2}, 
    {6,7,8,9,1,2,3,4,5},{9,1,2,3,4,5,6,7,8}}; 
    printSudoku(sudoku); 
    removeSudoku(sudoku); 
    System.out.println(); 
    printSudoku (sudoku); 
    } 

出力:私たちは、その後、繰り返しなしで0-8からintの順列でそれらを移入し、0

を入力するように行列の要素のマップとしてそれらを使用すると、ここではサンプルコードです

1 2 3 |4 5 6 |7 8 9 
4 5 6 |7 8 9 |1 2 3 
7 8 9 |1 2 3 |4 5 6 
------------------- 
2 3 4 |5 6 7 |8 9 1 
5 6 7 |8 9 1 |2 3 4 
8 9 1 |2 3 4 |5 6 7 
------------------- 
3 4 5 |6 7 8 |9 1 2 
6 7 8 |9 1 2 |3 4 5 
9 1 2 |3 4 5 |6 7 8 

1 2 3 |0 5 6 |7 8 9 
4 5 6 |7 8 9 |0 2 3 
0 8 9 |1 2 3 |4 5 6 
------------------- 
2 3 0 |5 6 7 |8 9 1 
5 6 7 |8 0 1 |2 3 4 
8 9 1 |2 3 0 |5 6 7 
------------------- 
3 0 5 |6 7 8 |9 1 2 
6 7 8 |9 1 2 |3 4 0 
9 1 2 |3 4 5 |6 0 8 
2

このコードを使用することができます。行列を完全な値のsudokuで作ったわけではありませんが、出力を見ることができます。関数はdeleteRandom()です。

8 1 5 4 2 5 3 0 2 1 
3 6 0 4 5 5 3 3 5 8 
6 9 4 3 8 2 3 8 0 7 
2 9 9 1 0 5 7 6 9 2 
4 0 6 7 7 9 5 6 6 2 
2 9 1 8 8 7 9 9 8 0 
0 4 6 2 7 3 8 5 8 1 
1 8 5 2 1 8 0 4 8 7 
4 7 5 0 6 6 6 4 3 3 
9 6 3 5 6 0 4 7 1 6 

各行と各列にはゼロが1つしかなく、プログラムが実行されるたびに変更されます。

import java.util.ArrayList; 
import java.util.LinkedHashSet; 
import java.util.Random; 
import java.util.Set; 

public class test { 
    public static void main(String[] args) { 
     int[][] sodoku = new int[10][10]; 
     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       Random random = new Random(); 
       int max = 9; 
       int min = 1; 
       sodoku[i][j] = random.nextInt(max - min + 1) + min; 
      } 
     } 
     print(sodoku); 
     deleteRandom(sodoku); 
    } 

    private static void deleteRandom(int[][] sodoku) { 
     Random r = new Random(); 
     Set<Integer> rowSet = new LinkedHashSet<>(); 
     while (rowSet.size() != 10) { 
      int answer = r.nextInt(10); 
      rowSet.add(answer); 
     } 
     ArrayList<Integer> rowList = new ArrayList<>(); 
     rowList.addAll(rowSet); 

     Set<Integer> colSet = new LinkedHashSet<>(); 
     while (colSet.size() != 10) { 
      int answer = r.nextInt(10); 
      colSet.add(answer); 
     } 
     ArrayList<Integer> colList = new ArrayList<>(); 
     colList.addAll(colSet); 
     for (int i = 0; i < 10; i++) { 
      sodoku[rowList.get(i)][colList.get(i)] = 0; 
     } 
     System.out.println(); 
     print(sodoku); 
    } 

    private static void print(int[][] sodoku) { 
     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 
       System.out.print(sodoku[i][j] + " "); 
      } 
      System.out.println(); 
     } 
    } 
} 
関連する問題