数独
玩数独的一个作弊方法
用c++实现数独的解法
使用方法:
输入9*9的一组数字,有相应的数字的输入该数字,没有的话在该位置输入0
在较短的时间内算出该解(反正比我快)
输入样例:
8 0 0 0 0 0 0 0 0
0 0 3 6 0 0 0 0 0
0 7 0 0 9 0 2 0 0
0 5 0 0 0 7 0 0 0
0 0 0 0 4 5 7 0 0
0 0 0 1 0 0 0 3 0
0 0 1 0 0 0 0 6 8
0 0 8 5 0 0 0 1 0
0 9 0 0 0 0 4 0 0
代码实现:
#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int h[10][10];
int l[10][10];
int xiao[10][10];
void print()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
void dfs(int x,int y)
{
if(a[x][y]!=0)
{
if(x==9&&y==9)print();
else if(y==9)dfs(x+1,1);
else dfs(x,y+1);
}
else
{
for(int i=1;i<=9;i++)
{
if(h[x][i]==0&&l[y][i]==0&&xiao[(x-1)/3*3+(y-1)/3+1][i]==0)
{
a[x][y]=i;
h[x][i]=1;
l[y][i]=1;
xiao[(x-1)/3*3+(y-1)/3+1][i]=1;
if(x==9&&y==9)print();
else if(y==9)dfs(x+1,1);
else dfs(x,y+1);
a[x][y]=0;
h[x][i]=0;
l[y][i]=0;
xiao[(x-1)/3*3+(y-1)/3+1][i]=0;
}
}
}
}
int main()
{
int i,j;
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
memset(l,0,sizeof(l));
memset(xiao,0,sizeof(xiao));
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]!=0)
{
h[i][a[i][j]]=l[j][a[i][j]]=xiao[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1;
}
}
}
dfs(1,1);
return 0;
}
可以试一下,有bug请留言