poj-2676 Sudoku

       題意:數獨,一種數學遊戲。規則:空白處填入數字,使數獨的每一行,每一列,每個宮格中沒有重複數字。

       思路:該題DFS暴搜就能過,數據比較水,真正厲害的數獨題是3074(本人目前無力AC)。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#define INF 0x3f3f3f3f
#define mod 1000000007

using namespace std;

struct node
{
    int x,y;
}point[81];
int mp[11][11];
bool vis_h[10][10];
bool vis_l[10][10];
bool vis_m[10][10];
int k,flag;

void DFS(int cnt)
{
    if(cnt==k)
    {
        flag=1;
        return ;
    }
    int x=point[cnt].x;
    int y=point[cnt].y;
    for (int i=1;i<=9;i++)
    {
        if(!vis_h[x][i]&&!vis_l[y][i]&&!vis_m[(x-1)/3*3+(y-1)/3+1][i])
        {
            mp[x][y]=i;
            vis_h[x][i]=1;
            vis_l[y][i]=1;
            vis_m[(x-1)/3*3+(y-1)/3+1][i]=1;
            DFS(cnt+1);
            if(flag) return ;
            vis_h[x][i]=0;
            vis_l[y][i]=0;
            vis_m[(x-1)/3*3+(y-1)/3+1][i]=0;
        }
    }
}

int main()
{
    int i,j;
    int t;
    char z[20];
    scanf("%d%*c",&t);
    while(t--)
    {
        memset(mp,0,sizeof(mp));
        memset(vis_h,0,sizeof(vis_h));
        memset(vis_l,0,sizeof(vis_l));
        memset(vis_m,0,sizeof(vis_m));
        k=0;flag=0;
        for (i=1;i<=9;i++)
        {
            scanf("%s",z);
            for (j=1;j<=9;j++)
            {
                mp[i][j]=z[j-1]-'0';
                if(!mp[i][j])
                {
                    point[k].x=i;
                    point[k++].y=j;
                }
                else
                {
                    int x=mp[i][j];
                    vis_h[i][x]=1;
                    vis_l[j][x]=1;
                    vis_m[(i-1)/3*3+(j-1)/3+1][x]=1;
                }
            }
        }
        DFS(0);
        for(i=1;i<=9;i++)
        {
            for (j=1;j<=9;j++)
            {
                printf("%d",mp[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章