poj 2676 数独 ---dfs

来源:互联网 发布:eplan软件价格 编辑:程序博客网 时间:2024/06/11 17:51

每行 每列 每个小九宫格里 某个数字是否存在 记录下来



#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>using namespace std;int r[10][10],c[10][10],s[10][10],ma[10][10],zero;int dfs(int x,int y){    int i,flag,k;    if(zero==0) return 1;    if(x==10) return 0;    if(ma[x][y])    {        if(y==9) flag=dfs(x+1,1);        else flag=dfs(x,y+1);        if(flag) return 1;        else return 0;    }    else    {        for(i=1;i<=9;i++)        {            k=3*((x-1)/3)+(y-1)/3+1;            if(!r[x][i]&&!c[y][i]&&!s[k][i])            {                r[x][i]=1;                c[y][i]=1;                s[k][i]=1;                ma[x][y]=i;                zero--;                if(y==9) flag=dfs(x+1,1);                else flag=dfs(x,y+1);                if(flag) return 1;                else                {                    r[x][i]=0;                    c[y][i]=0;                    s[k][i]=0;                    ma[x][y]=0;                    zero++;                }            }        }    }    return 0;}int main(){    int i,j,t,a;    scanf("%d",&t);    getchar();    while(t--)    {        memset(r,0,sizeof r);        memset(c,0,sizeof c);        memset(s,0,sizeof s);        zero=0;        for(i=1;i<=9;i++)        {            for(j=1;j<=9;j++)            {                a=getchar()-'0';                ma[i][j]=a;                if(a==0) zero++;                else                {                    r[i][a]=1;                    c[j][a]=1;                    s[3*((i-1)/3)+(j-1)/3+1][a]=1;                }            }            getchar();        }        dfs(1,1);        for(i=1;i<=9;i++)        {            for(j=1;j<=9;j++)                printf("%d",ma[i][j]);            putchar('\n');        }    }    return 0;}


0 0
原创粉丝点击