• 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;
    }


  • 相关阅读:
    Linux安装jdk
    虚拟机克隆配置
    eclipse 设置默认编码为Utf-8
    working copy is not up-to-date
    request、response 中文乱码问题与解决方式
    eclipse Some projects cannot be imported because they already exist in the workspace
    Eclipse 常用快捷键
    Error Code: 1175 Mysql中更新或删除时报错(未带关键字条件)
    jsp中文件下载的实现
    mySql 自动备份数据库
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7008196.html
Copyright © 2020-2023  润新知