zoukankan      html  css  js  c++  java
  • #leetcode刷题之路37-解数独

    编写一个程序,通过已填充的空格来解决数独问题。
    一个数独的解法需遵循如下规则:
    数字 1-9 在每一行只能出现一次。
    数字 1-9 在每一列只能出现一次。
    数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
    空白格用 '.' 表示。
    一个数独。
    答案被标成红色。
    Note:
    给定的数独序列只包含数字 1-9 和字符 '.' 。
    你可以假设给定的数独只有唯一解。
    给定数独永远是 9x9 形式的。

    #include <iostream>
    #include <vector>
    using  namespace std;
    
    bool isvalid(int i,int j,int ans,vector<vector<char>>& board)
    {
        for (int k = 0; k < 9; k++) //判断同行同列是否有重复
        {
            if (board[k][j] == ans) return false;
            if (board[i][k] == ans) return false;
        }
        //算出所在的宫格块左上角位置
        i=i/3*3;
        j=j/3*3;
        //判断宫格内是重复
        for(int k=i;k<i+3;k++)
            for(int h=j;h<j+3;h++)
            {
                if (board[k][h] == ans) return false;
            }
        return true;
    }
    
    bool try_ans(vector<vector<char>>& board)
    {
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                if (board[i][j]!='.') continue;
                for (char ans = '1'; ans <= '9'; ans++)
                {
                    if (!isvalid(i,j,ans,board)) continue;//是否可以放入
                    board[i][j] = ans;
                    if (try_ans(board)) return true;//是否放完了
                    else board[i][j] = '.';
                }
                return false;
            }
        }
        return true;//最后每个地方都放入了数字,返回真
    }
    
    void solveSudoku(vector<vector<char>>& board)
    {
        try_ans(board);
    }
    
    int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }
  • 相关阅读:
    实验八 进程间通信
    实验七 信号
    实验六 进程基础
    实验五 shell脚本编程
    实验四 Linux系统C语言开发环境学习
    实验三 linux系统用户管理及VIM配置
    实验二 Linux系统简单文件操作命令
    实验一 linux系统与应用准备
    myatbis的一个好的封装
    php上传微信素材
  • 原文地址:https://www.cnblogs.com/biat/p/10601213.html
Copyright © 2011-2022 走看看