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

 

posted @ 2019-03-26 16:47  maitianpt  阅读(253)  评论(0编辑  收藏  举报