Description
Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some of the cells are written decimal digits from 1 to 9. The other cells are empty. The goal is to fill the empty cells with decimal digits from 1 to 9, one digit per cell, in such way that in each row, in each column and in each marked 3x3 subsquare, all the digits from 1 to 9 to appear. Write a program to solve a given Sudoku-task.
Input
The input data will start with the number of the test cases. For each test case, 9 lines follow, corresponding to the rows of the table. On each line a string of exactly 9 decimal digits is given, corresponding to the cells in this line. If a cell is empty it is represented by 0.
Output
For each test case your program should print the solution in the same format as the input data. The empty cells have to be filled according to the rules. If solutions is not unique, then the program may print any one of them.
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
hi
题目大意
数独游戏。规则:在9*9的格子里,预先给你一些数。你要把它填满,你填的每个数字必须满足以下四个约束。
a。同行不重;
b。同列不重;
c。所在小方格不重;
d。属于[1,9]范围。
编程实现。若有多解,输出其中任意一个均可。
注意:
问:数独解答过程中,我在某个位置r行c列放了数x,x满足a\b\c\d四个约束,那么这一步一定是对的么?
答:不一定是对的。这样放,截至目前是对的,但在后续填写其他方格时会发现前面的一些尝试是错的,需要回溯。
//POJ-2676 Sudoku 深搜+回溯 AC
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Main {
int[][] ditu = new int[9][9]; // 九宫格
boolean row[][] = new boolean[9][10]; // row[r][x] 标记在第r行中数字x是否出现
boolean col[][] = new boolean[9][10];// col[c][x] 标记在第c列中数字x是否出现
boolean grid[][] = new boolean[9][10]; // grid[k][x] 标记在第k个3*3子格中数字x是否出现
void init(){
for(int i=0;i<9;i++)
for(int j=0;j<10;j++)
row[i][j] = col[i][j] = grid[i][j] = false;
}
boolean DFS(int r, int c) {
//全部摆满
if (r == 9)
return true;
boolean flag = false;
// r行c列放过了
if (ditu[r][c] != 0) {
// 一行摆满
if (c == 8)
flag = DFS(r + 1, 0);
// 一行没摆满
else
flag = DFS(r, c + 1);
// 回溯
return flag;
}
else {
int k = r / 3 * 3 + c / 3;
for (int i = 1; i <= 9; i++)
// 枚举数字1~9填空
if (!row[r][i] && !col[c][i] && !grid[k][i]) {
ditu[r][c] = i;
row[r][i] =col[c][i] = grid[k][i] = true;
if (c == 8)
flag = DFS(r + 1, 0);
else
flag = DFS(r, c + 1);
// 回溯,继续枚举
if (!flag) {
ditu[r][c] = 0;
row[r][i] = col[c][i] = grid[k][i] = false;
}
else
return true;
}
}
return flag;
}
public void read(Scanner scanner) {
for (int r = 0; r < 9; r++){
String str=scanner.nextLine();
for (int c = 0; c < 9; c++) {
ditu[r][c] = str.charAt(c)-'0';
if (ditu[r][c] != 0) {
int k = r / 3 * 3 + c / 3;
row[r][ditu[r][c]] =col[c][ditu[r][c]] = grid[k][ditu[r][c]] = true;
}
}
}
}
public static void main(String[] args) throws FileNotFoundException {
//Scanner scanner = new Scanner(new File("d:/in.txt"));
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//过滤一次,以后成行读
scanner.nextLine();
Main sudoku=new Main();
while (n-- > 0){
sudoku.init();
sudoku.read(scanner);
sudoku.DFS(0, 0);
for (int r = 0; r < 9; r++) {
for (int c = 0; c < 9; c++)
System.out.print(sudoku.ditu[r][c]);
System.out.println();
}
}
scanner.close();
}
}