输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的数字。
输出九行,每行九个空格隔开的数字,为解出的答案。
0 9 0 0 0 0 0 6 0 8 0 1 0 0 0 5 0 9 0 5 0 3 0 4 0 7 0 0 0 8 0 7 0 9 0 0 0 0 0 9 0 8 0 0 0 0 0 6 0 2 0 7 0 0 0 8 0 7 0 5 0 4 0 2 0 5 0 0 0 8 0 7 0 6 0 0 0 0 0 9 0
7 9 3 8 5 1 4 6 2 8 4 1 2 6 7 5 3 9 6 5 2 3 9 4 1 7 8 3 2 8 4 7 6 9 5 1 5 7 4 9 1 8 6 2 3 9 1 6 5 2 3 7 8 4 1 8 9 7 3 5 2 4 6 2 3 5 6 4 9 8 1 7 4 6 7 1 8 2 3 9 5
不觉的我的代码有什么问题,题目说了是9x9,然后测试用例居然有9x1是几个意思!
import java.util.Scanner;
/**
* 数独是一个非常有名的游戏。整个是一个9X9的大宫格,其中又被划分成9个3X3的小宫格。
* 要求在每个小格中放入1-9中的某个数字。要求是:每行、每列、每个小宫格中数字不能重复。
* 现要求用计算机求解数独。
*
* @author shijiacheng
*/
public class SudokuSolution {
private int[][] sudoku;
public SudokuSolution(int[][] sudoku){
this.sudoku = sudoku;
}
public static void main(String[] args){
// 号称世界上最难数独
int[][] suduku = new int[9][9];
/*int[][] suduku = {
{8, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 3, 6, 0, 0, 0, 0, 0},
{0, 7, 0, 0, 9, 0, 2, 0, 0},
{0, 5, 0, 0, 0, 7, 0, 0, 0},
{0, 0, 0, 0, 4, 5, 7, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 3, 0},
{0, 0, 1, 0, 0, 0, 0, 6, 8},
{0, 0, 8, 5, 0, 0, 0, 1, 0},
{0, 9, 0, 0, 0, 0, 4, 0, 0}};*/
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
suduku[i][j] = sc.nextInt();
}
}
sc.close();
SudokuSolution solution = new SudokuSolution(suduku);
solution.findNumber(0,0);
}
private void findNumber(int i, int j){
if (i == 8 && j==9){
//success find
printResult();
return;
}
if (j == 9){
i++;
j = 0;
}
if (sudoku[i][j] == 0){
for (int k = 1; k <=9 ; k++) {
if (canUse(i,j,k)){
sudoku[i][j] = k;
findNumber(i,j+1);
}else {
sudoku[i][j] = 0;
}
}
}else {
findNumber(i,j+1);
}
}
private boolean canUse(int row,int line,int number){
for (int i = 0; i < 9; i++) {
if (sudoku[row][i] == number || sudoku[i][line] == number){
return false;
}
}
//判断小九宫格是否有重复
int eachRow = row / 3;
int eachLine = line / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (sudoku[eachRow * 3 + i][eachLine * 3 + j] == number) {
return false;
}
}
}
return true;
}
private void printResult(){
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (j<8){
System.out.print(sudoku[i][j] + " ");
}else {
System.out.print(sudoku[i][j]);
}
}
System.out.println();
}
System.out.println();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author wylu
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[][] sudoku = new int[9][9];
for (int i = 0; i < 9; i++) {
String[] strs = br.readLine().split(" ");
for (int j = 0; j < 9; j++) {
sudoku[i][j] = Integer.parseInt(strs[j]);
}
}
dfs(sudoku, 0, 0);
}
private static boolean dfs(int[][] sudoku, int i, int j) {
if (i == 8 && j == 9) {
prtSudoku(sudoku);
return true;
}
if (j == 9) {
i++;
j = 0;
}
boolean res = false;
if (sudoku[i][j] == 0) {
boolean[] options = optionalNumber(sudoku, i, j);
for (int k = 1; k < options.length; k++) {
if (!res && !options[k]) {
sudoku[i][j] = k;
res = dfs(sudoku, i, j + 1);
}
}
if (!res) sudoku[i][j] = 0;
} else {
dfs(sudoku, i, j + 1);
}
return res;
}
private static void prtSudoku(int[][] sudoku) {
for (int i = 0; i < sudoku.length; i++) {
for (int j = 0; j < sudoku[0].length - 1; j++) {
System.out.print(sudoku[i][j] + " ");
}
System.out.println(sudoku[i][sudoku[0].length - 1]);
}
}
private static boolean[] optionalNumber(int[][] sudoku, int x, int y) {
boolean[] options = new boolean[10];
for (int i = 0; i < sudoku.length; i++) {
options[sudoku[x][i]] = true;
options[sudoku[i][y]] = true;
}
int row = x / 3 * 3, col = y / 3 * 3;
for (int i = row; i < row + 3; i++) {
for (int j = col; j < col + 3; j++) {
options[sudoku[i][j]] = true;
}
}
return options;
}
}
import java.util.Scanner;
public class T_77 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int a[][] = new int[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
a[i][j] = sc.nextInt();
}
}
backTrace(0,0,a);
}
/**
* 数独算法
*
* @param i 行号
* @param j 列号
*/
public static void backTrace(int i, int j, int a[][]) {
if (i == 8 && j == 9) {
//已经成功了,打印数组即可
printArray(a);
return;
}
//已经到了列末尾了,还没到行尾,就换行
if (j == 9) {
i++;
j = 0;
}
//如果i行j列是空格,那么才进入给空格填值的逻辑
if (a[i][j] == 0) {
for (int k = 1; k <= 9; k++) {
//判断给i行j列放1-9中的任意一个数是否能满足规则
if (check(i, j, k, a)) {
//将该值赋给该空格,然后进入下一个空格
a[i][j] = k;
backTrace(i, j + 1, a);
//初始化该空格
a[i][j] = 0;
}
}
} else {
//如果该位置已经有值了,就进入下一个空格进行计算
backTrace(i, j + 1, a);
}
}
/**
* 判断给某行某列赋值是否符合规则
*
* @param row 被赋值的行号
* @param line 被赋值的列号
* @param number 赋的值
* @return
*/
private static boolean check(int row, int line, int number, int a[][]) {
//判断该行该列是否有重复数字
for (int i = 0; i < 9; i++) {
if (a[row][i] == number || a[i][line] == number) {
return false;
}
}
//判断小九宫格是否有重复
int tempRow = row / 3;
int tempLine = line / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (a[tempRow * 3 + i][tempLine * 3 + j] == number) {
return false;
}
}
}
return true;
}
/**
* 打印矩阵
*/
public static void printArray(int a[][]) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if(j==8)
System.out.println(a[i][j]);
else
System.out.printf("%d ",a[i][j]);
}
}
}
} /*
本来我和一楼认为的一样怎么输入是一维的..
结果我发现只是牛客网有bug没有打印全所有的输入输出而已
写bug半小时,解bug两小时... 本质就是一个dfs不过是带返回值判断的,只要找到一组解就返回
一开始写的少了一个乘法... 结果过了25%,一看给的输入好生气,后来dubug花了两个小时.....
下面有第二个测试的输入和正确输出, 第一个就是给的例子
*/
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
vector<vector<int>>gg;
vector<vector<int>>c;
vector<vector<int>>line;
bool cheak(int val, int m, int n)
{
if (m < 0 || n < 0 || m >= 9 || n > 9)
{
return false;
}
if (!gg[m / 3 * 3 + n / 3][val] && !line[n][val] && !c[m][val])
return true;
return false;
}
vector<vector<int>>res;
bool dfs(vector<vector<int>>&ret, int m, int n)
{
if (n == 9)
{
m++;
n = 0;
}
if (m == 9)
{
res = ret;
return true;
}
// 表示当前是已经弄好的数字
if (ret[m][n] != 0)
{
n++;
return dfs(ret, m, n);
}
for (int i = 1; i <= 9; i++)
{
if (cheak(i, m, n))
{
ret[m][n] = i;
line[n][i] = 1;
c[m][i] = 1;
gg[m / 3 * 3 + n / 3][i] = 1;
// 表示是有效数字
if (dfs(ret, m, n + 1))
return true;
line[n][i] = 0;
c[m][i] = 0;
gg[m / 3 * 3 + n / 3][i] = 0;
ret[m][n] = 0;
}
}
return false;
}
};
/*
0 0 4 5 0 0 9 7 0 8 2 4 5 3 1 9 7 6
0 6 0 8 2 9 0 0 3 5 6 7 8 2 9 1 4 3
1 0 0 0 0 0 5 0 0 1 9 3 4 6 7 5 2 8
9 0 0 0 5 6 0 0 2 9 0 0 0 5 6 0 0 2
0 7 0 2 0 8 0 1 0
0 1 6 3 7 4 0 0 0
4 0 9 6 1 2 3 8 7
0 8 0 9 4 3 0 0 5
6 3 2 7 8 5 4 9 1
8 2 4 5 3 1 9 7 6
5 6 7 8 2 9 1 4 3
1 9 3 4 6 7 5 2 8
9 4 8 1 5 6 7 3 2
3 7 5 2 9 8 6 1 4
2 1 6 3 7 4 8 5 9
4 5 9 6 1 2 3 8 7
7 8 1 9 4 3 2 6 5
6 3 2 7 8 5 4 9 1
*/
int main()
{
ios::sync_with_stdio(false);
vector<vector<int>>matrix(9, vector<int>(9, 0));
vector<vector<int>>line(9, vector<int>(10, 0));
vector<vector<int>>clu(9, vector<int>(10, 0));
vector<vector<int>>gongge(9, vector<int>(10, 0));
int tmp;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cin >> tmp;
matrix[i][j] = tmp;
clu[i][tmp] = 1;
line[j][tmp] = 1;
gongge[i / 3 * 3 + j / 3][tmp] = 1;
}
}
// 此时已经完成了输入
Solution s1;
s1.gg = gongge;
s1.c = clu;
s1.line = line;
s1.dfs(matrix, 0, 0);
for (int i = 0; i < 9; i++)
{
int j = 0;
for (;j < 8; j++)
{
cout << s1.res[i][j] << " ";
}
cout << s1.res[i][j] << endl;
}
return 0;
}
##栈实现DFS?
board=[]
for _ in range(9):
board.append(input().replace(' ',''))
#print(board)
def isV(board,x,y,c):
for i in range(9):
if board[x][i]==c or board[i][y]==c:
return False
for j in range(3*(x//3),3*(x//3)+3):
for k in range(3*(y//3),3*(y//3)+3):
if board[j][k]==c: return False
return True
num=[]
for i in range(9):
for j in range(9):
if board[i][j]=='0':
num.append([i,j])
q=[[board,0]]
res='#'
while q:
board,idx=q.pop()
if idx==len(num):
res=board[:]
break
i,j=num[idx]
for c in '123456789':
if isV(board,i,j,c):
tmp=board[i]
cur=tmp[:j]+c+tmp[j+1:]
board[i]=cur
q.append([board[:],idx+1])
for i in range(9):
s1=[]
for c in res[i]:
s1.append(c)
print(' '.join(s1))
import java.util.Scanner;
public class Main {
private int[][] numMap = new int[9][9];
private int staLen;
private Coordinate[] stack = new Coordinate[81];
public void run() {
init();
find(0);
}
//dfs
private void find(int step) {
if (step == staLen) {
//判断是否找到一个解
show();
System.exit(0);
} else {
for (int i = 1; i <= 9; i++) {
int x = stack[step].x;
int y = stack[step].y;
if (tryNum(x, y, i)) {
numMap[y][x] = i;
find(step + 1);//若可填入,继续尝试下一个空
numMap[y][x] = 0;//回溯时把原来填的数字归0
}
}
}
}
//判断坐标(x,y)能否填入num
private boolean tryNum(int x, int y, int num) {
//先判断同行同列有无重复
for (int i = 0; i < 9; i++) {
if (numMap[y][i] == num || numMap[i][x] == num) {
return false;
}
}
//分组判断
x /= 3;
y /= 3;
for (int i = y * 3; i < y * 3 + 3; i++) {
for (int j = x * 3; j < x * 3 + 3; j++) {
if (numMap[i][j] == num) {
return false;
}
}
}
return true;
}
//初始化读入数据
private void init() {
Scanner sc = new Scanner(System.in);
for (int y = 0; y < 9; y++) {
for (int x = 0; x < 9; x++) {
numMap[y][x] = sc.nextInt();
if (numMap[y][x] == 0) {
stack[staLen++] = new Coordinate(x, y);
}
}
}
sc.close();
}
//输出
private void show() {
for (int y = 0; y < 9; y++) {
for (int x = 0; x < 9; x++) {
//每行第一个数字前面没有空格
if(x == 0){
System.out.print(numMap[y][x]);
}else{
System.out.print(" " + numMap[y][x]);
}
}
System.out.println();
}
}
//坐标类
static class Coordinate {
int x;
int y;
Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args){
new Main().run();
}
} 先把所有的0坐标用数组存起来,然后深度优先搜索#include<iostream>
#include<vector>
using namespace std;
bool check(vector<vector<int>> & soduku,int x,int y,int n){
for(int i = 0;i<9;i++){
if(soduku[i][y] == n)return false;
if(soduku[x][i] == n)return false;
}
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
if(soduku[x/3*3+i][y/3*3+j] == n)return false;
}
}
return true;
}
bool solvesudo(vector<vector<int>> & soduku,int cur){
if(cur == 81)return true;
int x = cur/9;
int y = cur%9;
if(soduku[x][y]!=0)return solvesudo(soduku, cur+1);
for(int i = 1;i<10;i++){
if(check(soduku,x,y,i)){
soduku[x][y] = i;
if(solvesudo(soduku,cur+1))return true;
soduku[x][y] = 0;
}
}return false;
}
int main(){
vector<vector<int>>soduku(9,vector<int>(9,0));
for(int i = 0;i<9;i++){
for(int j = 0;j<9;j++){
cin>>soduku[i][j];
}
}
solvesudo(soduku, 0);
for(int i = 0;i<9;i++){
for(int j = 0;j<9;j++){
if(j!=8)cout<<soduku[i][j]<<" ";
else cout<<soduku[i][j];
}
cout<<endl;
}
return 0;
}
def dfs(matrix,zero_index):
if not zero_index:
for line in matrix:
line = list(map(str,line))
print(' '.join(line))
return
else:
x,y = zero_index[0]
value_not_be = []
for y1 in range(9):
value_not_be.append(matrix[x][y1])
for x1 in range(9):
value_not_be.append(matrix[x1][y])
x2 = x//3*3
y2 = y//3*3
value_not_be.extend([matrix[x2+i][y2+j] for i in range(3) for j in range(3)])
value_not_be = [i for i in value_not_be if i != 0]
value_not_be = set(value_not_be)
if len(value_not_be) == 9:
return
for i in range(1,10):
if i not in value_not_be:
matrix1 = [i.copy() for i in matrix]
matrix1[x][y] = i
dfs(matrix1,zero_index[1:])
import sys
matrix = []
for _ in range(9):
line = list(map(int,sys.stdin.readline().strip().split(' ')))
matrix.append(line)
zero_index = []
for i in range(9):
for j in range(9):
if matrix[i][j] == 0:
zero_index.append((i,j))
dfs(matrix,zero_index)
def isValid(board,row,col,c): flag = True for i in range(9): if board[row][i] == c: flag = False break for i in range(9): if board[i][col] == c: flag = False break for i in range(3*(row/3),3*(row/3)+3): for j in range(3*(col/3),3*(col/3)+3): if board[i][j] == c: flag = False break if flag == False: break return flag def solve(board): for i in range(9): for j in range(9): if board[i][j] == '0': for c in range(1,10): if isValid(board,i,j,str(c)): board[i][j] = str(c) if solve(board): return True else: board[i][j] = '0' return False return True if __name__ == "__main__": matrix = [[] for i in range(9)] for i in range(9): line = raw_input() lines = line.split() for item in lines: matrix[i].append(item) solve(matrix) for i in range(9): print " ".join(matrix[i])
import java.util.*;
public class Main {
public static int[][] sudo = new int[9][9];//创建数组
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
sudo[i][j] = sc.nextInt(); //创建数独
}
}
if (backTracking(sudo)) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (j == 8) {
//最后一位数需要换行输出
System.out.println(sudo[i][j]);
} else {
System.out.print(sudo[i][j] + " ");
}
}
}
}
}
}
public static boolean backTracking(int[][] sudo) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) { //遍历数组
if (sudo[i][j] != 0) { //如果不需要填数字直接continue
continue;
}
for (int k = 1; k <= 9; k++) { //循环填数字
if (isValid(i, j, k, sudo)) { //判断填入数字是否符合要求
sudo[i][j] = k; //填数字
if (backTracking(sudo)) { //递归
return true;
}
sudo[i][j] = 0; //回溯
}
}
return false;//如果没有符合要求的数字返回false
}
}
return true;
}
public static boolean isValid(int row, int col, int k, int[][] sudo) {
for (int i = 0; i < 9; i++) { //检查行
if (sudo[row][i] == k) {
return false;
}
}
for (int i = 0; i < 9; i++) { //检查列
if (sudo[i][col] == k) {
return false;
}
}
int startRow = (row / 3) * 3;
int endCol = (col / 3) * 3;
for (int i = startRow; i < startRow + 3; i++) { //检查九宫格
for (int j = endCol; j < endCol + 3; j++) {
if (sudo[i][j] == k) {
return false;
}
}
}
return true;
}
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10;
char g[N][N];
bool row[N][N], col[N][N], cell[3][3][N];
bool dfs(int x, int y)
{
if(y == 9) x ++, y = 0;
if(x == 9)
{
for(int i = 0; i < 9;i ++)
{
for(int j = 0;j < 9;j ++)
{
cout << g[i][j] << ' ';
}
cout << endl;
}
return true;
}
if(g[x][y] != '.') return dfs(x ,y + 1);
for(int i = 0;i < 9 ;i ++)
{
if(!row[x][i] && !col[y][i] && !cell[x / 3][y / 3][i])
{
g[x][y] = i + '1';
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true;
if(dfs(x, y + 1)) return true;
row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false;
g[x][y] = '.';
}
}
return false;
}
int main()
{
for(int i = 0;i < 9;i ++)
{
for(int j = 0;j < 9;j ++)
{
cin >> g[i][j];
if(g[i][j] != '.')
{
int t = g[i][j] - '1';
row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true;
}
}
}
dfs(0, 0);
return 0;
} #include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int MAXN=100;
int a[10][10];
bool h[10][10],l[10][10],g[10][10],flag;
int pre[9][9]={
1,1,1,2,2,2,3,3,3,
1,1,1,2,2,2,3,3,3,
1,1,1,2,2,2,3,3,3,
4,4,4,5,5,5,6,6,6,
4,4,4,5,5,5,6,6,6,
4,4,4,5,5,5,6,6,6,
7,7,7,8,8,8,9,9,9,
7,7,7,8,8,8,9,9,9,
7,7,7,8,8,8,9,9,9,
};
void dfs(int k){
if(k>80){
for(int i=0;i<9;++i){
for(int j=0;j<9;++j){
printf("%d ",a[i][j]);
}
printf("\n");
}
return;
}
int x=k/9;
int y=k%9;
if(a[x][y]>0){
dfs(k+1);
}
else{
for(int i=0;i<=9;++i){
if(!h[x][i] && !l[y][i] && !g[pre[x][y]][i] ){
h[x][i]=true;
l[y][i]=true;
g[pre[x][y]][i]=true;
a[x][y]=i;
dfs(k+1);
h[x][i]=false;
l[y][i]=false;
g[pre[x][y]][i]=false;
a[x][y]=0;
}
}
}
}
int main(){
for(int i=0;i<9;++i){
for(int j=0;j<9;++j)
{
scanf("%d",&a[i][j]);
int x=a[i][j];
h[i][x]=true;
l[j][x]=true;
g[pre[i][j]][x]=true;
}
}
dfs(0);
return 0;
} 用例为:
0 0 8 7 1 9 2 4 5 9 0 5 2 3 4 0 8 6 0 7 4 8 0 6 1 0 3 7 0 3 0 9 2 0 0 0 5 0 0 0 0 0 0 0 0 8 6 1 4 0 3 5 2 9 4 0 0 0 2 0 0 0 8 0 0 0 0 0 0 0 7 0 1 0 7 0 6 8 0 5 0
答案为(第7,8行不一样):
6 3 8 7 1 9 2 4 5 9 1 5 2 3 4 7 8 6 2 7 4 8 5 6 1 9 3 7 4 3 5 9 2 8 6 1 5 9 2 6 8 1 4 3 7 8 6 1 4 7 3 5 2 9 4 5 6 3 2 7 9 1 8 3 8 9 1 4 5 6 7 2 1 2 7 9 6 8 3 5 4 6 3 8 7 1 9 2 4 5 9 1 5 2 3 4 7 8 6 2 7 4 8 5 6 1 9 3 7 4 3 5 9 2 8 6 1 5 9 2 6 8 1 4 3 7 8 6 1 4 7 3 5 2 9 4 5 9 3 2 7 6 1 8 3 8 6 1 4 5 9 7 2 1 2 7 9 6 8 3 5 4
对应第二个答案的代码如下:
#!/usr/bin/env python
#ret = [[i for i in range(9)] for i in range(9)]
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ret = []
for i in range(9):
ret1 = map(int, raw_input().split())
ret.append(ret1)
#ret = [[5, 0, 0, 9, 2, 0, 7, 0, 0], [0, 7, 0, 3, 4, 0, 8, 0, 0], [0, 2, 0, 0, 1, 0, 0, 5, 0], [7, 0, 4, 0, 6, 0, 1, 0, 0], [6, 0, 2, 1, 8, 3, 9, 4, 0], [0, 9, 0, 7, 5, 4, 0, 0, 8], [0, 0, 5, 8, 3, 6, 0, 7, 9], [0, 3, 9, 0, 7, 2, 6, 0, 1], [8, 0, 0, 4, 9, 1, 5, 2, 3]]
def func1(arr):
for i in range(len(arr)):
if 0 in arr[i]:
return False
return True
#get existed num set, including 0
def func2(arr, row, col):
lst = list(arr[row])
i1 = ((row+3)/3 - 1) * 3
j1 = ((col+3)/3 - 1) * 3
for i in range(9):
lst.append(arr[i][col])
for i in range(i1, i1+3):
for j in range(j1, j1+3):
lst.append(arr[i][j])
#print "func2----------------------"
#print row, col, lst
lst = list(set(lst))
return lst
def print_matrix(arr):
for i in range(9):
print ' '.join(map(str, arr[i]))
def func(arr, row, col):
if func1(arr):
lst = func2(arr, row, col)
if len(lst) == 9:
#print_matrix(arr)
return True
else:
return False
else:
#arr1 = copy.deepcopy(arr)
for i in range(9):
for j in range(9):
if arr[i][j] == 0:
lst = func2(arr, i, j)
lst_rest = list(set(nums) - set(lst))
#print i, j, lst, lst_rest
if not lst_rest:
return False
for n in lst_rest:
arr[i][j] = n
if func(arr, i, j):
return True
else:
arr[i][j] = 0
return False
func(ret, 0, 0)
print_matrix(ret)
import java.util.*;
public class Test{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
List<Set<Integer>> listRow=new ArrayList<Set<Integer>>();
List<Set<Integer>> listCol=new ArrayList<Set<Integer>>();
List<Set<Integer>> listGroup=new ArrayList<Set<Integer>>();
int[][] Soduku=new int[9][9];
for(int i=0;i<9;i++) {
listRow.add(new TreeSet<Integer>());
listCol.add(new TreeSet<Integer>());
listGroup.add(new TreeSet<Integer>());
}
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
Soduku[i][j]=scanner.nextInt();
listRow.get(i).add(Soduku[i][j]);
listCol.get(j).add(Soduku[i][j]);
listGroup.get(i/3*3+j/3).add(Soduku[i][j]);
}
}
soduku(Soduku,listRow,listCol,listGroup,0);
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(j!=8) {
System.out.print(Soduku[i][j]+" ");
}else {
System.out.println(Soduku[i][j]);
}
}
}
}
public static Boolean soduku(int[][] Soduku,List<Set<Integer>> listRow,List<Set<Integer>> listCol,List<Set<Integer>> listGroup,int index){
Set<Integer> temp=new TreeSet<Integer>();
Set<Integer> set1=new TreeSet<Integer>();
Set<Integer> set2=new TreeSet<Integer>();
int row=index/9;
int col=index%9;
int group=row/3*3+col/3;
// System.out.println(index);
if(index>80) {
return true;
}
for(int i=0;i<10;i++) {
temp.add(i);
}
if(Soduku[row][col]!=0) {
return soduku(Soduku, listRow, listCol, listGroup, index+1);
}else {
set1.addAll(listRow.get(row));
set1.addAll(listCol.get(col));
set1.addAll(listGroup.get(group));
set2.addAll(temp);
set2.removeAll(set1);
if(set2.size()==0) {
return false;
}
// System.out.print(set2+"--->"+set2.size());
for(Iterator<Integer> it=set2.iterator();it.hasNext();) {
int t=it.next();
// System.out.println("-------->"+t);
// System.out.println(t);
Soduku[row][col]=t;
listRow.get(row).add(t);
listCol.get(col).add(t);
listGroup.get(row/3*3+col/3).add(t);
if(soduku(Soduku, listRow, listCol, listGroup, index+1)) {
return true;
}
// System.out.println(index+"------>"+t);
Soduku[row][col]=0;
listRow.get(row).remove(t);
listCol.get(col).remove(t);
listGroup.get(row/3*3+col/3).remove(t);
}
set1.clear();
set2.clear();
return false;
}
}
} #include <bits/stdc++.h>
using namespace std;
int graph[9][9];
int row_visited[9][10];
int col_visited[9][10];
int box_visited[9][10];
int res[9][9];
void dfs(int cnt)
{
if(cnt==81)
{
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++) res[i][j] = graph[i][j];
}
return;
}
int x = cnt/9, y = cnt%9;
if(graph[x][y]==0)
{
for(int u=1; u<=9; u++)
{
if(row_visited[x][u]==0 && col_visited[y][u]==0 && box_visited[x/3*3+y/3][u]==0)
{
graph[x][y] = u;
row_visited[x][u] = 1;
col_visited[y][u] = 1;
box_visited[x/3*3+y/3][u] = 1;
dfs(cnt+1);
box_visited[x/3*3+y/3][u] = 0;
col_visited[y][u] = 0;
row_visited[x][u] = 0;
graph[x][y] = 0;
}
}
}
else dfs(cnt+1);
}
void show()
{
for(int i=0; i<9; i++)
{
cout<<res[i][0];
for(int j=1; j<9; j++) cout<<" "<<res[i][j];
cout<<endl;
}
}
int main()
{
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
cin>>graph[i][j];
if(graph[i][j]!=0)
{
row_visited[i][graph[i][j]] = 1;
col_visited[j][graph[i][j]] = 1;
box_visited[i/3*3+j/3][graph[i][j]] = 1;
}
}
}
dfs(0);
show();
return 0;
} import java.util.Scanner;
/**
* @Author qgfzzzzzz
* @Date 2019/8/19
* @Version 1.0
* <p>
*
* </p>
*/
public class Main {
public static int[][] board;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
board = new int[9][9];
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
board[i][j] = scanner.nextInt();
}
}
solve(board);
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(j == 8) System.out.println(board[i][j]);
else System.out.print(board[i][j] + " ");
}
}
}
public static boolean solve(int[][] board){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] == 0){
for(int k = 1; k <= 9; k++) {
if(isValid(i, j, board, k)){
board[i][j] = k;
if(solve(board))
return true;
else board[i][j] = 0;
}
}
return false;
}
}
}
return true;
}
public static boolean isValid(int row, int col, int[][] board, int target){
for(int i = 0; i < 9; i++){
if(board[row][i] != 0 && board[row][i] == target) return false;
if(board[i][col] != 0 && board[i][col] == target) return false;
if(board[(row / 3) * 3 + i / 3][(col / 3) * 3 + i % 3] != 0 && board[(row / 3) * 3 + i / 3][(col / 3) * 3 + i % 3] == target) return false;
}
return true;
}
}
import java.util.*;
public class Main{
static int[][] map = new int[9][9];
static boolean[][] rows = new boolean[9][10];
static boolean[][] cols = new boolean[9][10];
static boolean[][] blocks = new boolean[9][10];
static Scanner sc = new Scanner(System.in);
public static void main(String[] args){
// 解析数据
inputNum();
// 深度优先搜索
dfs(0, 0);
// 输出结果
printNum();
}
private static void inputNum(){
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
int tmp = sc.nextInt();
map[i][j] = tmp;
rows[i][tmp] = true;
cols[j][tmp] = true;
int index = i / 3 * 3 + j / 3;
blocks[index][tmp] = true;
}
}
}
private static void printNum(){
for (int i = 0; i < 9; i++){
StringBuilder sb = new StringBuilder();
for (int j = 0; j < 9; j++){
sb.append(map[i][j] + " ");
}
sb.deleteCharAt(sb.length() - 1);
System.out.println(sb);
}
}
private static boolean dfs(int i, int j){
while (map[i][j] != 0){
j++;
if (j == 9){
if (i == 8){
return true;
}
i++;
j = 0;
}
}
int index = i / 3 * 3 + j / 3;
for (int k = 1; k <= 9; k++){
if (canPutNum(i, j, index, k)){
putNum(i, j, index, k);
if (dfs(i, j)){
return true;
}
// 回溯
map[i][j] = 0;
rows[i][k] = false;
cols[j][k] = false;
blocks[index][k] = false;
}
}
return false;
}
private static boolean canPutNum(int i, int j, int index, int k){
return !rows[i][k] && !cols[j][k] && !blocks[index][k];
}
private static void putNum(int i, int j, int index, int k){
map[i][j] = k;
rows[i][k] = true;
cols[j][k] = true;
blocks[index][k] = true;
}
}
结构最清晰的解数独代码,输出结果时记得删除每行最后一个空格