POJ2676-Sudoku

【题目描述】

数独是一项非常简单的任务。如图所示,具有9行和9列的方形表被分成9个较小的正方形3x3。在一些单元格中写入从1到9的十进制数字。其他单元格为空。目标是用1到9的十进制数字填充空单元格,每个单元格一个数字,这样在每行,每列和每个标记的3x3子方格中,所有数字从1到9出现。编写程序来解决给定的Sudoku任务。 

【输入】

输入数据将以测试用例的数量开始。对于每个测试用例,后面跟着9行,对应于表的行。在每一行上给出一串精确的9位十进制数字,对应于该行中的单元格。如果单元格为空,则表示为0。

【输出】

对于每个测试用例,您的程序应以与输入数据相同的格式打印解决方案。必须根据规则填充空单元格。如果解决方案不是唯一的,则程序可以打印其中任何一个。

【输入示例】

1

103000509

002109400

000704000

300502006

060000050

700803004

000401000

009205800

804000107

【输出示例】

143628579

572139468

986754231

391542786

468917352

725863914

237481695

619275843

854396127

【思路】

这是一道搜索题,虽然检查的时候很恶心,但是没有什么很难的地方。

因为一共有81个格子,并且题目已经为你填好了一些,所以我们可以从第0个格子开始搜索。

int f(int n)
{
    if(n>80)//如果格子都填满了,跳出,正确。 
    {
        flag=true;
        return 0;
    }
    int i,j;
    if(s[n/9][n%9]!=0)//如果格子已经填了,那么搜索下一个 
        f(n+1);
    else
        for(i=1;i<=9;i++)
            if(check(n,i)==true)
            {
                s[n/9][n%9]=i;
                f(n+1);
                if(flag==true)
                    return 0;
                s[n/9][n%9]=0;//如果不能填,归零。 
            }
}

每一个填的格子有一个检查是否可以应用的函数check

bool check(int n,int x)
{
    int i,j;
    for(i=0;i<9;i++)//横排 
    {
        j=n/9;
        if(s[j][i]==x)
            return false;
    }
    for(i=0;i<9;i++)//竖排 
    {
        j=n%9;
        if(s[i][j]==x)
            return false;
    }
    int a,b;//九宫格判断 
    a=n/9/3*3;
    b=n%9/3*3; 
    for(i=a;i<a+3;i++)
        for(j=b;j<b+3;j++)
        {
            if(s[i][j]==x)
                return false;
        }
    return true;
}

最重要的一点是每次输完一个数据之后要清零。我就因为这个改了很久。

#include<iostream>
using namespace std;
bool flag=false;
int s[15][15];
void in()
{
    char sd[15][15];
    int i,j;
    for(i=0;i<9;i++)
        for(j=0;j<9;j++)
        {
            cin>>sd[i][j];
            s[i][j]=sd[i][j]-'0';
        }
}
void out()
{
    int i,j;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9;j++)
            cout<<s[i][j];
        cout<<endl;
    }
}
bool check(int n,int x)
{
    int i,j;
    for(i=0;i<9;i++)//横排 
    {
        j=n/9;
        if(s[j][i]==x)
            return false;
    }
    for(i=0;i<9;i++)//竖排 
    {
        j=n%9;
        if(s[i][j]==x)
            return false;
    }
    int a,b;//九宫格判断 
    a=n/9/3*3;
    b=n%9/3*3; 
    for(i=a;i<a+3;i++)
        for(j=b;j<b+3;j++)
        {
            if(s[i][j]==x)
                return false;
        }
    return true;
}
int f(int n)
{
    if(n>80)//如果格子都填满了,跳出,正确。 
    {
        flag=true;
        return 0;
    }
    int i,j;
    if(s[n/9][n%9]!=0)//如果格子已经填了,那么搜索下一个 
        f(n+1);
    else
        for(i=1;i<=9;i++)
            if(check(n,i)==true)
            {
                s[n/9][n%9]=i;
                f(n+1);
                if(flag==true)
                    return 0;
                s[n/9][n%9]=0;//如果不能填,归零。 
            }
}
int main()
{
    int m;
    cin>>m;
    int i,j;
    for(i=0;i<m;i++)
    {
        in();
        f(0);
        out();
        flag=false;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/4D24/p/9449319.html