数独暴力求解


早上做了一个”高级“难度的数独发现真是难到爆炸,于是乎决定写一个暴力程序枚举一下,于是出现此文。
思路很简单,深搜即可,每次check一下,不行就回溯。
话不多说,很简单,直接上代码。

/*
About: sudoku 
Auther: kongse_qi
Date:2017/05/03
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>

#define maxn 9

#define read(x) scanf("%d", &x)

int x[maxn][maxn];

void Read()
{
	for(int i = 0; i != maxn; ++i)
	{
		for(int j = 0; j != maxn; ++j)
		{
			read(x[i][j]);
		}
	}
	return ;
}

bool Check(int a, int b, int n)
{
	for(int i = 0; i != maxn; ++i)
	{
		if(x[a][i] == n && i != b)	return false;
	}
	for(int i = 0; i != maxn; ++i)
	{
		if(x[i][b] == n && i != a)	return false;
	}
	for(int i = a/3*3; i != a/3*3+3; ++i)
	{
		for(int j = b/3*3; j != b/3*3+3; ++j)
		{
			if(x[i][j] == n && (i != a || b != j))	return false;
		}
	}
	return true;	
}

void Print()
{
	for(int i = 0; i != maxn; ++i)
	{
		for(int j = 0; j != maxn; ++j)
		{
			printf("%d ", x[i][j]);
		}
		printf("\n");
	}
	return ;
}

bool Dfs(int tot)
{
	if(tot > 80)
	{
		return true; 
	}
	int curx = tot/9, cury = tot%9;
	if(!x[curx][cury])
	{
		for(int i = 1; i != 10; ++i)
		{
			x[curx][cury] = i;
			if(Check(curx, cury, i))
			{
				if(Dfs(tot+1))	return true;
			}
			x[curx][cury] = 0;
		}
	}
	else return Dfs(tot+1);
	return false;
}
int main()
{
	freopen("test.in", "r", stdin); 
	Read();
	Dfs(0);
	Print();
	return 0;
}

水了一篇...
箜瑟_qi 2017/05/05 11:55

posted @ 2017-05-05 11:57  箜瑟_qi  阅读(302)  评论(0)    收藏  举报