Remove one random element from each row and column in a Sudoku matrix

+1 vote
asked Sep 12, 2017 by alan

In a previous post I mentioned how you could remove one element in a Sudoku matrix from each row. Now, I am thinking of ways to remove one element from the Sudoku matrix, but for each row and column. I am thinking of creating an array that stores the column index from were the element was removed in the row. Then in the next row were you iterate to remove another element check to see if the number you removed is in the column index that was previously stored. Although I do not think that it will be a very efficient algorithm.

Remove element from row method

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

2 Answers

+1 vote
answered Sep 13, 2017 by assafs

To do it efficiently, I would suggest creating two arrays of indexes (one for the columns, one for the rows), each 9 int long. It's more efficient than using lists. We then populate them with a permutation of ints from 0-8 without repetitions, and use them as a map of which elements in the matrix to enter 0.

Here's a sample code:

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); }

The output will be the original sudoku matrix and then the removed one:

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 votes
answered Mar 9, 2018 by abhishek-honey

You can use this code. I have not made the matrix with perfect values of sudoku but you can see the output. The function is 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 

In each row and each column there is only one zero and it will change every time the program executes.

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(); } }
}
Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
...