9*9的數獨(dfs)

liuliu2333發表於2018-03-19

蒜頭君今天突然開始還念童年了,想回憶回憶童年。他記得自己小時候,有一個很火的遊戲叫做數獨。便開始來了一局緊張而又刺激的高階數獨。蒜頭君做完發現沒有正解,不知道對不對? 不知道聰明的你能否給出一個標準答案?

標準數獨是由一個給與了提示數字的 9×99 \times 99×9 網格組成,我們只需將其空格填上數字,使得每一行,每一列以及每一個 3×33 \times 33×3 宮都沒有重複的數字出現。

  膜拜大佬,自己真寫不出來。。。

用結構體去儲存輸入中的空白(0),真精明,化成一維的。漲姿勢了。

#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int b[10][10];
int ha[10][10],lie[10][10];
typedef pair<int ,int> pii;
pii P[100];
int ok=0,s=0;
bool check(int x,int o)
{
	pii p=P[x];
	int m=(p.first-1)/3*3;
	int n=(p.second-1)/3*3;
	for(int i=m+1;i<=m+3;i++)
	{
		for(int j=n+1;j<=n+3;j++)
		{
			if(a[i][j]==o)
			return false;
		}
	}
	return true;
}
void dfs(int x)
{
	if(ok==1)
	return;
	if(x==s)
	{
		ok=1;
		for(int i=1;i<10;i++)
		{
			for(int j=1;j<10;j++)
			printf("%d ",a[i][j]);
			printf("\n");
		}
		return;
	}
	pii p=P[x];
	for(int i=1;i<=9;i++)
	{
		if(!ha[p.first][i]&&!lie[p.second][i]&&check(x,i))
		{
			ha[p.first][i]=1;lie[p.second][i]=1;
			a[p.first][p.second]=i;
			dfs(x+1);
			ha[p.first][i]=0;lie[p.second][i]=0;
			a[p.first][p.second]=0;
		}
	}
}
int main()
{
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]!=0)
			{
				ha[i][a[i][j]]=1;
				lie[j][a[i][j]]=1;
			}
			else
			{
				P[s].first=i;
				P[s++].second=j;
			}
		}
	}
	dfs(0);
	return 0;
 } 

相關文章