简易数独(9*9)

来源:互联网 发布:仓储淘宝王一样的小说 编辑:程序博客网 时间:2024/05/18 00:20

题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=722
【题意】
数独游戏,含0的位置被填入1~9的数字之后,使得每一行每一列的数字都不一样。
【思路】
模板,不过在找到确定值之后,就要一直return,不然会超时。
【代码】

#include<map>#include<stack>#include<queue>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<iostream>#include<string>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long LL;int a[9][9];int flag;bool check(int x,int y){    for(int i=0; i<9; i++)        if(i!=x&&a[i][y]==a[x][y]||i!=y&&a[x][i]==a[x][y])            return 0;    int fx=x/3*3;    int fy=y/3*3;    for(int i=fx; i<fx+3; i++)    {        for(int j=fy; j<fy+3; j++)        {            if(i!=x&&j!=y&&a[i][j]==a[x][y])                return 0;        }    }    return 1;}void dfs(int k){    if(k==81)    {        for(int i=0; i<9; i++)        {            printf("%d",a[i][0]);            for(int j=1; j<9; j++)            {                printf(" %d",a[i][j]);            }            printf("\n");        }        flag=1;//标记已找到。        return ;    }    int x=k/9;    int y=k%9;    if(!a[x][y])    {        for(int i=1; i<=9; i++)        {            a[x][y]=i;            if(check(x,y))                dfs(k+1);            if(flag)                return;            a[x][y]=0;        }    }    else       {            dfs(k+1);            if(flag)                return;       }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        for(int i=0; i<9; i++)        {            for(int j=0; j<9; j++)            {                scanf("%d",&a[i][j]);            }        }        flag=0;        dfs(0);    }}
0 0
原创粉丝点击