序:
早上做了一个”高级“难度的数独发现真是难到爆炸,于是乎决定写一个暴力程序枚举一下,于是出现此文。
思路很简单,深搜即可,每次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