codevs 2924 数独挑战

水题。爆搜。写得比较丑。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
using namespace std;
int n=9,a[10][10],h[10][10],l[10][10],cx[10][10],xx[299],yy[299],cnt;
int check(int i,int j) {
    int r;
    if(i<=3) {if(j<=3) r=1; else if(j>3&&j<7) r=2; else r=3;}
    else if(i>3&&i<7) {if(j<=3) r=4; else if(j>3&&j<7) r=5; else r=6;}
    else {if(j<=3) r=7; else if(j>3&&j<7) r=8; else r=9;}
    return r;
}
int dfs(int now) {
    if(now==cnt+1) return 1;
    int x=xx[now],y=yy[now],z=check(x,y);
    for(int i=1;i<=n;i++) if(!h[x][i]&&!l[y][i]&&!cx[z][i]){
        a[x][y]=i;
        h[x][i]=l[y][i]=cx[z][i]=1;
        if(dfs(now+1)) return 1;
        h[x][i]=l[y][i]=cx[z][i]=0;
        a[x][y]=0;
    }
    return 0;
}
int main()
{
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=n;j++) {
            scanf("%d",&a[i][j]);
            int x=a[i][j];
            if(x) {
                h[i][x]=1;
                l[j][x]=1;
                cx[check(i,j)][x]=1; 
            }
            else xx[++cnt]=i,yy[cnt]=j;
        } 
    dfs(1);
    for(int i=1;i<=n;i++) {
        for(int j=1;j<n;j++) 
            printf("%d ",a[i][j]);
        printf("%d\n",a[i][9]);
    }
    return 0;
}
View Code

 

posted @ 2017-09-20 20:08  啊宸  阅读(114)  评论(0编辑  收藏  举报