51| 数独

代码实现

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int a[N][N];
bool col[N][N], row[N][N], st[3][3][N];
bool dfs(int x, int y)
{
	// 出口
	if(y == 10)
	{
		x ++;
		y = 1;
	 } 
	if(x == 10) return true;
	if(a[x][y]) return dfs(x, y+1); // 已经填值了 
	for(int i = 1; i <= 9; i++)
	{
		if(row[x][i] || col[y][i] || st[(x-1)/3][(y-1)/3][i]) continue; // 剪枝
		 // 递归搜索
		 row[x][i] = col[y][i] = st[(x-1)/3][(y-1)/3][i] = 1;
		 a[x][y] = i; 
		 if(dfs(x, y+1)) return true; // 已经找到结果 
		 // 回溯 
		 row[x][i] = col[y][i] = st[(x-1)/3][(y-1)/3][i] = 0;
		 a[x][y] = 0; 
	 } 
	 return false; // 前面有填错了 
}
int main()
{
	for(int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= 9; j++)
		{
			int x; cin >> x;
			a[i][j] = x;
			if(x)	row[i][x] = col[j][x] = st[(i-1)/3][(j-1)/3][x] = 1; // 标记 
		}
	}
	dfs(1,1);
	for(int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= 9; j++) cout << a[i][j] << " ";
		cout << endl; 
	}
	return 0;
}
相关推荐
半瓶榴莲奶^_^2 小时前
优先级队列(堆)
java·数据结构·算法
小樱花的樱花2 小时前
C++引用:高效编程的技巧
开发语言·数据结构·c++·算法
Yupureki2 小时前
《算法竞赛从入门到国奖》算法基础:动态规划-最长子序列
c语言·c++·算法·动态规划
沉鱼.442 小时前
进制转换题
开发语言·c++·算法
罗湖老棍子2 小时前
维护序列(信息学奥赛一本通- P1551)(洛谷-P2023)
算法·线段树·区间修改区间查询·多重懒标记
Boop_wu2 小时前
[Java 算法] 归并排序
数据结构·算法·排序算法
今儿敲了吗2 小时前
49| 枚举排列
数据结构·c++·笔记·学习·算法
-凌凌漆-2 小时前
【C语言】大小端判断
linux·c语言·算法
xsyaaaan2 小时前
leetcode-hot100-图论:200岛屿数量-994腐烂的橘子-207课程表-208实现前缀树
leetcode·图论