POJ 2676 数独

Posted dxy0310

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2676 数独相关的知识,希望对你有一定的参考价值。

题意:

  给你一个9*9的未完成的数独,将其填完

思路:

  暴搜

  从第一个位置搜起,有数字就直接跳过搜下一个位置,没数字就填数字
  。通过行,列,九宫格不能重复填数,把能填的数填进去就可以了

 

技术分享图片
//By DXY 2018.04.27
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define maxn 100000
int n,m;
int num[10][10];
char a[10];
bool flag;
bool check(int x,int cnt)
{
    int hang=cnt/9;//
    int lie=cnt%9;//
    for(int i=0;i<9;i++)//同行中不重复 
    {
        if(num[hang][i]==x)
            return false;
    }
    for(int i=0;i<9;i++)//同列中不重复 
    {
        if(num[i][lie]==x)
            return false;
    }
    int left=hang/3*3;//九宫格左上角的行和列 
    int right=lie/3*3;
    for(int i=left;i<left+3;i++)//九宫格中不重复 
        for(int j=right;j<right+3;j++)
            if(num[i][j]==x)
                return false;
    return true;//可以将此数填入空格中 
}
void dfs(int cnt)
{
    if(cnt>80||flag)//全部填满,返回 
    {
        flag=true;
        return ;
    }
    if(num[cnt/9][cnt%9])//位置上有数,直接搜下一个 
    {
        dfs(cnt+1);
        if(flag)
        return ;
    }
    else 
    {
        for(int i=1;i<=9;i++)//填数 
        {
            if(check(i,cnt))
            {
                num[cnt/9][cnt%9]=i;
                dfs(cnt+1);
                if(flag)
                    return ;
                num[cnt/9][cnt%9]=0;//回溯,还原现场 
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        flag=false;
        for(int i=0;i<9;i++)
        {
            scanf("%s",a);
            for(int j=0;j<9;j++)
                num[i][j]=a[j]-0;
        }
        dfs(0);//从第一个位置开始搜 
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                cout<<num[i][j];
            }
            cout<<endl;
        }
    }    return 0;
}
View Code

 

以上是关于POJ 2676 数独的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2676 - Sudoku(数独)

POJ 2676 数独(DFS)

POJ 2676 数独

POJ2676 – Sudoku(数独)—DFS

POJ 2676 Sudoku (数独 DFS)

ACM : POJ 2676 SudoKu DFS - 数独