dfs(0634-数独)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs(0634-数独)相关的知识,希望对你有一定的参考价值。

问题描述

数独是非常流行的益智游戏,把一个9x9的九宫格分成9个小的3x3的小九宫,如下图所示。在这个九宫格上,每个小格子可以填的数字为1,2,3,...,9。初始时,某些格子已经填好数字,剩余的一些则为空白,你的任务是把空白的数字都填上1,2,3,...,9数字的一个,使得表格上每一行、每一列、以及每一个小九宫均含有有1,2,3,...,9(显然每个数字在每行、每列和每个小九宫中都出现并且只能出现一次)。请你写一个程序解决数独问题。
技术分享

输入

输入为9行,每行9个数字,其中0代表对应的小格子为空白的格子。

输出

输出为9行,每行9个有1,2,3,...,9构成的数字。即数独问题的解。

输入样列
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
输出样例
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
说一下思路吧,我是参考黄学长的~就是将每一行每一列每一个九宫格标记一下,然后dfs搜索,注意边界和搜索完要保持原先的状态即可~
#include<bits/stdc++.h>
#define Next(x,y) y==9 ? dfs(x+1,1) : dfs(x,y+1)
using namespace std;

int a[10][10],b[10][10];
bool l[10][10],r[10][10],s[10][10];
int Map[10][10];

int fill(int x,int y,int k)
{
	if(l[x][k]||r[y][k]||s[Map[x][y]][k]) return 0;
	b[x][y]=k;
	l[x][k]=r[y][k]=s[Map[x][y]][k]=1;
	return 1;
}

void del(int x,int y,int k)
{
	b[x][y]=0;
	l[x][k]=r[y][k]=s[Map[x][y]][k]=0;
}

void print()
{
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			cout<<b[i][j]<<"";
			cout<<"\n";}
}

void dfs(int x,int y)
{
	if(x==10&&y==1)
	{
		print();exit(0);
	}
	if(b[x][y]) Next(x,y);
	else
	{
		for(int i=1;i<=9;i++)
		{
			if(fill(x,y,i))
			{
				Next(x,y);
				del(x,y,i);//搜过之后要删除 
			}
		}
	}
}

void init()
{
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++)
			Map[i][j]=(i-1)/3*3+(j-1)/3+1;
}

int main()
{
	char str;
	init();
	/*for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			cout<<Map[i][j]<<" ";
			cout<<"\n";}*/
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			str=getchar();
			a[i][j]=str-‘0‘;
			if(a[i][j])
				fill(i,j,a[i][j]);
		}
		getchar();
	}
	dfs(1,1);
	/*for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			cout<<s[i][j]<<" ";
			cout<<"\n";}*/
}

 

以上是关于dfs(0634-数独)的主要内容,如果未能解决你的问题,请参考以下文章

数独 dfs

数独 (dfs)

洛谷 P1784 数独[DFS/回溯]

数独(dfs解)

NYOJ 722 数独(DFS)

POJ 2676 数独(DFS)