DFS求解数独

这篇博客介绍了一种使用深度优先搜索(DFS)算法解决数独问题的方法。程序首先读取9x9的数独输入,然后通过递归的DFS尝试填充值,并通过检查函数验证每个值是否符合数独的规则。当找到唯一解时,程序将输出完整的数独解决方案。示例中给出了两个不同难度的数独题目及其对应的解。
摘要由CSDN通过智能技术生成

**

问题描述

**
如下所示,玩家需要根据9*9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个色九宫内的数字均含1-9,不重复
数独的答案都是唯一的,所以,多个解也称为无解
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的目。但对会使用计算机编程的你来说,恐怕易如反掌了
本题的要求就是输入数独题目,程序输出的一解,我们保证所有已知数据的格式都是合法的,并且题目有一的解
格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。

输入:

005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700

程序应该输出:

145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,输入:

800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序应该输出:

812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452

代码求解

package test;
import java.math.BigInteger;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		char [][]table =new char[9][];
		for (int i = 0; i < 9; i++) {
			table[i]=scanner.nextLine().toCharArray();
		}
		dfs(table, 0, 0);
	}
	public static void dfs(char [][]table ,int x,int y ) {
		if (x==9) {
			print(table);
			System.exit(0);
		}
		if (table[x][y]=='0') {
			for (int k = 1; k < 10; k++) {
				if (check(table, x, y, k)) {
					table[x][y]=(char)('0'+k);
					dfs(table, x+(y+1)/9, (y+1)%9);//处理下一个状态
				}
			}
			table[x][y]='0';//回溯,重置为0
		}
		else {
			dfs(table, x+(y+1)/9, (y+1)%9);//处理下一个状态
		}
	}
	public static void print(char[][]table) {
		for (int i = 0; i < 9; i++) {
			System.out.println(new String(table[i]));
		}
	}
	public static boolean check(char[][]table,int i,int j,int k) {
		//检查同行和同列
		for (int l = 0; l < 9; l++) {
			if (table[i][l]==(char)('0'+k)) return false;
			if (table[l][j]==(char)('0'+k)) return false;
		}
		//检查小九宫格
		for (int l = (i/3)*3; l < (i/3+1)*3; l++) {
			for (int m = (j/3)*3; m < (j/3+1)*3; m++) {
				if (table[l][m]==(char)('0'+k)) {
					return false;
				}
			}
		}
		return true;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值