赞
踩
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。
输出九行,每行九个空格隔开的数字,为解出的答案。思路:典型的DFS回溯
- package l10;
-
- import java.util.*;
-
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- while(sc.hasNext()) {
- 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();
-
- System.out.println(solve(a));
-
- for(int i=0; i<9; i++) {
- StringBuilder sb = new StringBuilder();
- for(int j=0; j<9; j++)
- sb.append(a[i][j]+" ");
- System.out.println(sb.toString().trim());
- }
- }
- }
-
- private static boolean solve(int[][] a) {
- for(int i=0; i<9; i++)
- for(int j=0; j<9; j++) {
- if(a[i][j] == 0) {
- for(int k=1; k<10; k++) {
- if(isValid(a, i, j, k)) {
- a[i][j] = k;
- if(solve(a)) return true;
- a[i][j] = 0;
- }
- }
- return false;
- }
- }
- return true;
- }
-
- private static boolean isValid(int[][] a, int i, int j, int k) {
- for(int p=0; p<9; p++)
- if(a[i][p] == k || a[p][j] == k)
- return false;
-
- int s1 = i/3*3, s2 = j/3*3;
- for(int p=0; p<3; p++)
- for(int q=0; q<3; q++)
- if(a[s1+p][s2+q] == k)
- return false;
- return true;
- }
- }
类似的有N皇后问题:http://blog.csdn.net/hackbuteer1/article/details/6657109
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。