zoukankan      html  css  js  c++  java
  • NYOJ 722 数独

    这个之前也做过,只是就是,求出一种解法之后就退出了

    能够非常方便的改成找出全部解的形式


    时间限制:1000 ms  |  内存限制:65535 KB

    难度:4

    • 描写叙述

    •          数独是一种运用纸、笔进行演算的逻辑游戏。玩家须要依据9×9盘面上的已知数字,推理出全部剩余空格的数字。并满足每一行、每一列、每个3*3宫内的数字均含1-9,不反复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础。不论什么无解或多解的题目都是不合格的。

             有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序猿,哪能随随便便向困难低头。于是他决定编个程序来解决它。。


      • 输入

      • 第一行有一个数n(0< n <100)。表示有n组測试数据,每组測试数据是由一个9*9的九宫格构成。0表示相应的格子为空

      • 输出

      • 输出一个9*9的九宫格,为这个数独的答案

      • 例子输入

      • 1
        0 0 5 3 0 0 0 0 0
        8 0 0 0 0 0 0 2 0
        0 7 0 0 1 0 5 0 0
        4 0 0 0 0 5 3 0 0
        0 1 0 0 7 0 0 0 6
        0 0 3 2 0 0 0 8 0
        0 6 0 5 0 0 0 0 9
        0 0 4 0 0 0 0 3 0
        0 0 0 0 0 9 7 0 0
      • 例子输出

      • 1 4 5 3 2 7 6 9 8 
        8 3 9 6 5 4 1 2 7 
        6 7 2 9 1 8 5 4 3 
        4 9 6 1 8 5 3 7 2 
        2 1 8 4 7 3 9 5 6 
        7 5 3 2 9 6 4 8 1 
        3 6 7 5 4 2 8 1 9 
        9 8 4 7 6 1 2 3 5 
        5 2 1 8 3 9 7 6 4

    #include <iostream>
    #include <cstring>
     
    using namespace std;
     
    int sudoku[9][9];
     
    //推断填在空白位置的数字在行、列上是否符合要求
    bool Judge1(int x, int y, int n)
    {
        int i;
     
        for(i=0;i<9;i++)
        {
            //推断 列
            if((sudoku[i][y]==n) && (i!=x))
                return false;
            //推断 行
            if((sudoku[x][i]==n) && (i!=y))
                return false;
        }
     
        return true;
    }
     
    //推断填在空白位置的数字在九宫格之内是否符合要求
    bool Judge2(int x, int y, int n)
    {
        int xx,yy,i,j;
        xx=x/3;
        yy=y/3;
        for(i=xx*3;i<xx*3+3;i++)
            for(j=yy*3;j<yy*3+3;j++)
                if(sudoku[i][j]==n)
                    if(i==x && j==y)
                        continue;
                    else
                        return false;
        return true;
    }
     
    //填充空白数组
    bool Fill(int m)
    {
        int n,x,y;
        x=m/9;
        y=m%9;
        if (m>=81)
            return true;
        if (sudoku[x][y]==0)
        {
            for(n=1;n<=9;n++)
            {
                sudoku[x][y]=n;
                if(Judge1(x,y,n)&&Judge2(x,y,n))
                    if(Fill(m+1))
                        return true;
                sudoku[x][y]=0;
     
            }
        }
        else
            return Fill(m+1);
     
        return false;
    }
     
     
    int main()
    {
        int n,i,j,k;
        cin>>n;
        while(n--)
        {
            memset(sudoku,0,sizeof(sudoku));
            for(i=0;i<9;i++)
                for(j=0;j<9;j++)
                    cin>>sudoku[i][j];
            if(Fill(0))
            {
                for(i=0;i<9;i++)
                {
                    for(j=0;j<9;j++)
                        cout << sudoku[i][j] << " ";
                    cout << endl;
                }
            }
        }
        return 0;
    }


  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7008196.html
Copyright © 2011-2022 走看看