思路
1. 典型的深搜题
2. 框架 dfs(board, ith)
代码
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <deque>
#include <cstring>
#define MIN(x,y) (x)<(y)?(x):(y)
#define MAX(x,y) (x)>(y)?(x):(y)
using namespace std;
bool IsValid(vector<vector<char> > &board, int x, int y, int v) {
int size_row = board.size();
int size_col = board[0].size();
for(int i = 0; i < size_col; i ++) {
if(board[x][i] == v+'0') return false;
}
for(int j = 0; j < size_row; j ++) {
if(board[j][y] == v + '0') return false;
}
// x, y
for(int i = 0; i < 3; i ++) {
for(int j = 0; j < 3; j ++) {
int newx = (x/3)*3 + i;
int newy = (y/3)*3 + j;
if(board[newx][newy] == '0' + v)
return false;
}
}
}
void PrintMatrix(vector<vector<char> > &board) {
int size_row = board.size();
int size_col = board[0].size();
for(int i = 0; i < size_row; i ++) {
for(int j = 0; j < size_col; j ++) {
cout << board[i][j] << " ";
}
cout << endl;
}
}
bool found;
void dfs(vector<vector<char> > &board, int ith) {
int size_row = board.size();
int size_col = board[0].size();
if(ith == size_col*size_row) {
found = true;
return;
}
if(found) return;
int newx = ith / size_col;
int newy = ith - (ith / size_col) * size_col;
if(board[newx][newy] != '.') {
dfs(board, ith+1);
} else {
for(int v = 1; v <= 9 && !found; v ++) {
if(IsValid(board, newx, newy, v)) {
board[newx][newy] = v+'0';
dfs(board, ith+1);
if(found) return;
board[newx][newy] = '.';
}
}
}
}
class Solution {
public:
void solveSudoku(vector<vector<char> > &board) {
found = false;
dfs(board, 0);
}
};
int main() {
string matrix[9] = {"..9748...","7........",".2.1.9...","..7...24.",".64.1.59.",".98...3..","...8.3.2.","........6","...2759.." };
vector<vector<char> > board;
for(int i = 0; i < 9; i ++) {
vector<char> tmp(matrix[i].c_str(), matrix[i].c_str()+9);
board.push_back(tmp);
}
//PrintMatrix(board);
Solution so;
so.solveSudoku(board);
PrintMatrix(board);
return 0;
}