zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    wp7 db
    wp7 webpair
    wp7 弹出动画
    wp7 执行独立存储任务
    黑马程序员第二阶段JAVA网络编程第24天
    黑马程序员第二阶段图形用户界面第22天(1)
    黑马程序员第三阶段Java基础加强第26天
    黑马程序员第三阶段Java基础加强第25天
    黑马程序员第二阶段Java高级IO第21天
    黑马程序员第二阶段JAVA网络编程第23天
  • 原文地址:https://www.cnblogs.com/4D24/p/9449319.html
Copyright © 2011-2022 走看看