9*9数独游戏

分析:

深搜:很常规的从行开始遍历,遍历到底后,移到下一列再次遍历其行。如果遇到无法填入的情况则放回上一级尝试其他可选数字。

样例

输入
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
输出
125346897
831467925
276918543
489625371
912873456
753291684
367584219
694752138
548139762

import java.util.Scanner;

public class _12dfs数独游戏 {
	//可以以/和%的方式让标记进行换行和换列
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		char[][] matrix = new char[9][9];
		for (int i = 0; i < 9; i++)
			matrix[i] = sc.next().toCharArray();
		dfs(matrix, 0, 0);
	}

	static void dfs(char[][] matrix, int i, int j) {
		if (i == 9) {
			for (int a = 0; a < 9; a++)
				System.out.println(matrix[a]);
			System.exit(0);
		}

		if (matrix[i][j] == '0') {
			for (int k = 1; k < 10; k++) {
				if (check(matrix, i, j, k + '0')) {
					matrix[i][j] = (char) (k + '0');// 确定当前状态
					dfs(matrix, i + (j + 1) / 9, (j + 1) % 9);// 转移到下一个状态
				}
			}
			matrix[i][j] = '0';// 回溯
		} else {
			dfs(matrix, i + (j + 1) / 9, (j + 1) % 9);// 转移下一个状态
		}
	}

	private static boolean check(char[][] matrix, int i, int j, int k) {
		// TODO Auto-generated method stub
		for (int a = 0; a < 9; a++)
			if (matrix[i][a] == k)
				return false;
		for (int a = 0; a < 9; a++)
			if (matrix[a][j] == k)
				return false;
		return true;
	}
}

你可能感兴趣的:(dfs)