免费的在线数独
样例输入
9 0 7 0 0 0 0 0 0
0 0 0 0 0 0 8 0 0
0 0 0 0 0 6 5 0 2
1 0 0 0 0 0 0 7 0
0 0 0 0 5 0 0 0 0
3 0 0 9 0 2 0 0 0
0 2 0 0 8 0 0 0 0
0 0 0 3 0 0 0 4 0
0 0 5 0 0 0 0 0 0
样例输出
9 8 7 2 1 5 4 6 3
5 6 2 4 9 3 8 1 7
4 1 3 8 7 6 5 9 2
1 5 9 6 3 8 2 7 4
2 4 6 7 5 1 3 8 9
3 7 8 9 4 2 1 5 6
6 2 4 5 8 9 7 3 1
8 9 1 3 2 7 6 4 5
7 3 5 1 6 4 9 2 8
代码
#include<stdio.h>
#include<algorithm>
#define INF 0X3F3F3F3F
#define up(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
int MAP[10][10];
int CNT[10][10];
bool r[10][10];
bool c[10][10];
bool g[10][10];
int rk[100];
int id(int R,int C)
{
return (R-1)*9+C;
}
int gid(int R,int C)
{
int rr=(R-1)/3+1;
int cc=(C-1)/3+1;
return (rr-1)*3+cc;
}
void jc(int R,int C)
{
int cnt=0;
up(i,1,9) if(r[R][i]||c[C][i]||g[gid(R,C)][i]) cnt++;
if(MAP[R][C]) CNT[R][C]=INF;
else CNT[R][C]=9-cnt;
}
void gx(int R,int C,int V,bool x)
{
int ID=gid(R,C);
if(x)
{
MAP[R][C]=V;
r[R][V]=true;
c[C][V]=true;
g[ID][V]=true;
}
else
{
MAP[R][C]=0;
r[R][V]=false;
c[C][V]=false;
g[ID][V]=false;
}
up(i,1,9)
{
jc(i,C);
jc(R,i);
}
R=(ID-1)/3*3+1;
C=(ID-1)%3*3+1;
up(i,0,2) up(j,0,2) jc(R+i,C+j);
}
bool cmp(int i,int j)
{
int r1=(i-1)/9+1;
int r2=(j-1)/9+1;
int c1=(i-1)%9+1;
int c2=(j-1)%9+1;
return CNT[r1][c1]<CNT[r2][c2];
}
bool dfs()
{
sort(rk+1,rk+82,cmp);
int ID=rk[1];
int R=(ID-1)/9+1;
int C=(ID-1)%9+1;
if(CNT[R][C]==INF) return true;
if(CNT[R][C]==0) return false;
up(i,1,9)
{
if(r[R][i]||c[C][i]||g[gid(R,C)][i]) continue;
gx(R,C,i,1);
if(dfs()) return true;
gx(R,C,i,0);
}
return false;
}
void print()
{
puts("");
up(i,1,9)
{
up(j,1,9) printf("%d ",MAP[i][j]);
puts("");
}
puts("");
}
int main()
{
int temp;
up(i,1,9) up(j,1,9) CNT[i][j]=9;
up(i,1,9) up(j,1,9) {scanf("%d",&temp);gx(i,j,temp,1);}
up(i,0,99) rk[i]=i;
if(dfs()) print();
else printf("no\n");
return 0;
}