题目
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
示例1
输入:
输出:
Note:
- 给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
- 你可以假设给定的数独只有唯一解。
- 给定数独永远是 9x9 形式的。
思路
- 遍历board,遇到’.'是我们需要填数字的位置放入待填数组中,遇到数字转为int,分别在行、列、9宫块中标记这个数字已经用了
- dfs以0开始,取出第一个待填位置,
- 遍历这个位置可以放的数字,必须满足在行、列、9宫块中没出现过
- 如果可以,这个数字在行、列、9宫块标记,进入dfs
- dfs退出条件:所有待填数字都填好了,也就是下标为待填数组个数
代码
#include <stdio.h>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
class Solution {
public:
bool row[9][9];
bool col[9][9];
bool block[3][3][9];
vector<pair<int, int>> unnumber;
bool flag=false;
void solveSudoku(vector<vector<char>>& board) {
memset(row, false, sizeof(row));
memset(col, false, sizeof(col));
memset(block, false, sizeof(block));
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]=='.')
unnumber.emplace_back(i,j);
else
{
int num = board[i][j]-'0'-1;
row[i][num] = true;
col[j][num] = true;
block[i/3][j/3][num] = true;
}
}
}
dfs(board,0);
}
void dfs(vector<vector<char>>& board,int k){
if(k == unnumber.size()){
flag = true;
return ;
}
pair<int, int> tmp = unnumber[k];
int x = tmp.first,y = tmp.second;
for(int i=0;i<9;i++){
if(row[x][i]==false && col[y][i]==false && block[x/3][y/3][i]==false&&flag ==false){
row[x][i]=true;
col[y][i]=true;
block[x/3][y/3][i]=true;
board[x][y]=i+'0'+1;
dfs(board,k+1);
if(flag)
return;
row[x][i]=false;
col[y][i]=false;
block[x/3][y/3][i]=false;
}
}
}
};
int main()
{
vector<vector<char>> board(9,vector<char>(9,'.'));
board[0][0]='5';board[0][1]='3';board[0][4]='7';
board[1][0]='6';board[1][3]='1';board[1][4]='9';board[1][5]='5';
board[2][1]='9';board[2][2]='8';board[2][7]='6';
board[3][0]='8';board[3][4]='6';board[3][8]='3';
board[4][0]='4';board[4][3]='8';board[4][5]='3';board[4][8]='1';
board[5][0]='7';board[5][4]='2';board[5][8]='6';
board[6][1]='6';board[6][6]='2';board[6][7]='8';
board[7][3]='4';board[7][4]='1';board[7][5]='9';board[7][8]='5';
board[8][4]='8';board[8][7]='7';board[8][8]='9';
Solution s;
s.solveSudoku(board);
for(int i=0;i<9;i++){
for(int j =0;j<9;j++)
cout<<board[i][j];
cout<<endl;
}
return 0;
}
今天也是爱zz的一天哦!