【poj 2627】 Sudoku 题意&题解&代码(C++)

来源:互联网 发布:ubuntu 时区 编辑:程序博客网 时间:2024/06/04 19:37

题目链接:
http://poj.org/problem?id=2676
题意:
给出一个未填的数独,求这个数独的解并输出填好的数独,若此数独无解,则输出原给定的错误数独。
题解:
dfs回溯搜索
代码:

#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>using namespace std;int flag,T,f[15][15],c[15][15];char shu[15];int vis[4][4][10],visx[15][10],visy[15][10];void init(){    memset(vis,0,sizeof(vis));    memset(visx,0,sizeof(visx));    memset(visy,0,sizeof(visy));}void dfs(){    if (flag==1) return ;    int x=-1,y=-1;    for (int i=1;i<=9;i++)    for (int j=1;j<=9;j++)    if (c[i][j]==0)    {        x=i,y=j;        break;    }//  cout<<x<<' '<< y<<endl;    if (x==-1&&y==-1)     {        for (int i=1;i<=9;i++)                {                        for (int j=1;j<=9;j++)                        printf("%d",c[i][j]);                        printf("\n");                }        flag=1;        return ;    }    for (int i=1;i<=9;i++)    if (visx[x][i]==0&&visy[y][i]==0&&vis[(x-1)/3][(y-1)/3][i]==0)    {        visx[x][i]=1;visy[y][i]=1;vis[(x-1)/3][(y-1)/3][i]=1;        c[x][y]=i;        dfs();        c[x][y]=0;                visx[x][i]=0;visy[y][i]=0;vis[(x-1)/3][(y-1)/3][i]=0;           }}int main(){    scanf("%d",&T);    while(T--)    {        init();        for (int i=1;i<=9;i++)        {            scanf("%s",shu);            for (int j=1;j<=9;j++)            {                int tmp=shu[j-1]-'0';                f[i][j]=tmp;c[i][j]=tmp;                visx[i][tmp]=1;                visy[j][tmp]=1;                vis[(i-1)/3][(j-1)/3][tmp]=1;            }        }        flag=0;        dfs();        if (flag==0)            for (int i=1;i<=9;i++)        {                        for (int j=1;j<=9;j++)                        printf("%d",f[i][j]);                        printf("\n");            }    }}
0 0
原创粉丝点击