数独-解
来源:互联网 发布:天天聚财网网络借贷 编辑:程序博客网 时间:2024/05/17 23:03
#include <iostream>#include <vector>using namespace std;class Solution { vector<vector<bool> > rows; vector<vector<bool> > cols; vector<vector<bool> > blocks;public: void solveSudoku(vector<vector<char> > &board) { // Start typing your C/C++ solution below // DO NOT write int main() function rows.clear(); cols.clear(); blocks.clear(); rows.resize(9, vector<bool>(9, false)); cols.resize(9, vector<bool>(9, false)); blocks.resize(9, vector<bool>(9, false)); for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { char c = board[i][j]; if (c != '.') { rows[i][c - '1'] = cols[j][c - '1'] = blocks[(i / 3) * 3 + j / 3][c - '1'] = true; } } } sub(board, 0); } void sub(vector<vector<char> > &board, int index) { while (index < 81 && board[index / 9][index % 9] != '.') index++; if (index == 81){ for(int i=0;i<9;++i){ for(int j=0;j<9;++j){ cout<<board[i][j]; }cout<<endl; }cout<<endl; return ; } int row = index / 9, col = index % 9; for (int i = 0; i < 9; ++i) { if (rows[row][i] || cols[col][i] || blocks[(row / 3) * 3 + col / 3][i]) continue; rows[row][i] = cols[col][i] = blocks[(row / 3) * 3 + col / 3][i] = true; board[row][col] = '1' + i; sub(board, index + 1); board[row][col] = '.'; rows[row][i] = cols[col][i] = blocks[(row / 3) * 3 + col / 3][i] = false; } }};int main(){ vector<vector<char> > board(9,vector<char>(9,'.')); char ch[][10] ={"8........", "..36.....", ".7..9.2..", ".5...7...", "....457..", "...1...3.", "..1....68", "..85...1.", ".9....4.." }; for(int i=0;i<9;++i){ for(int j=0;j<9;++j){ board[i][j]=ch[i][j]; cout<<board[i][j]; }cout<<endl; } Solution s; s.solveSudoku(board); return 0;}