
题目描述
给一个数独九宫格,判断其是否有解。
题目分析
设置三种标记,行、列、九宫,然后深搜空白点。
代码
#include <iostream>
#include <vector>
#include <string.h>
const int MAX_SIZE = 10;
struct Node {
int first;
int second;
Node(int i, int j) {
first = i;
second = j;
}
Node() {
first = 0;
second = 0;
}
};
void show(int (*graph)[10]) {
for (int i = 0; i < 9; ++i) {
if (i % 3 == 0) {
std::cout << std::endl;
}
for (int j = 0; j < 9; ++j) {
if (j % 3 == 0) {
std::cout << " ";
}
if (graph[i][j] != 0) {
std::cout << graph[i][j] << " ";
} else {
std::cout << " ";
}
}
std::cout << std::endl;
}
}
class Solution {
public:
void solveSudoku(std::vector<std::vector<char> >& board) {
memset(hang, false, sizeof(hang));
memset(lie, false, sizeof(lie));
memset(jiu, false, sizeof(jiu));
memset(G, 0, sizeof(G));
noSize = 0;
for (unsigned i = 0; i < board.size(); ++i) {
for (unsigned j = 0; j < board[i].size(); ++j) {
if (board[i][j] == '.') {
noNumber[noSize++] = Node(i, j);
} else {
G[i][j] = board[i][j] - '0';
char c = board[i][j];
hang[i][c - '1'] = true;
lie[j][c - '1'] = true;
jiu[i/3*3+j/3][c - '1'] = true;
}
}
}
flag = false;
dfs(0, noSize);
for (unsigned i = 0; i < 9; ++i) {
for (unsigned j = 0; j < 9; ++j) {
board[i][j] = G[i][j] + '0';
}
}
}
void dfs(int j, int n) {
if (j == n) {
flag = true;
//show(G);
}
if (flag) {
return ;
}
for (int i = 0; i < 9; ++i) {
if (flag) {
break;
}
int x = noNumber[j].first;
int y = noNumber[j].second;
if (!hang[x][i] && !lie[y][i] && !jiu[x/3*3+y/3][i]) {
hang[x][i] = true;
lie[y][i] = true;
jiu[x/3*3+y/3][i] = true;
G[x][y] = i + 1;
dfs(j+1, n);
hang[x][i] = false;
lie[y][i] = false;
jiu[x/3*3+y/3][i] = false;
}
}
}
private:
bool hang[MAX_SIZE][MAX_SIZE];
bool lie[MAX_SIZE][MAX_SIZE];
bool jiu[MAX_SIZE][MAX_SIZE];
Node noNumber[100];
int noSize;
bool flag;
int G[MAX_SIZE][MAX_SIZE];
};
总结
折腾了半天,才将细节处理好




近期评论