数独

来源:互联网 发布:400÷1.25的简便算法 编辑:程序博客网 时间:2024/05/01 21:48

免费的在线数独

http://cn.sudokupuzzle.org/

样例输入

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;}


0 0
原创粉丝点击