LeetCode-Sudoku Solver

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

LeetCode-Sudoku Solver_第1张图片

A sudoku puzzle...

LeetCode-Sudoku Solver_第2张图片

...and its solution numbers marked in red.


这道题目就是普通的数独题,重点在于如何用最小的代价存储评判标准和最快的速度得到一个解。

class Solution {
	bool row[9][9], col[9][9], sq[3][3][9];
public:
	void solveSudoku(vector<vector<char> > &board) {
		memset(row, 0, sizeof(row)); memset(col, 0, sizeof(col)); memset(sq, 0, sizeof(sq));
		int emp(0), p(0);
		char posi[81][3];
		for (int i = 0; i < 9; ++i){
			for (int j = 0; j < 9; ++j){
				char tmp = board[i][j];
				if (tmp != '.'){
					row[i][tmp - '0' - 1] = 1;
					col[j][tmp - '0' - 1] = 1;
					sq[i / 3][j / 3][tmp - '0' - 1] = 1;
				}
				else {
					posi[emp][0] = i;
					posi[emp][1] = j;
					posi[emp++][2] = 1;
				}
			}
		}
		while (p<emp){
			if (p<0)return;
			int num = posi[p][2];
			for (; num<10; ++num){
				if (isValid(posi[p][0], posi[p][1], num - 1)){
					row[posi[p][0]][num - 1] = 1;
					col[posi[p][1]][num - 1] = 1;
					sq[posi[p][0] / 3][posi[p][1] / 3][num - 1] = 1;
					posi[p][2] = num;
					++p;
					break;
				}
			}
			if (num == 10){
				posi[p--][2] = 1;
				row[posi[p][0]][posi[p][2] - 1] = 0;
				col[posi[p][1]][posi[p][2] - 1] = 0;
				sq[(posi[p][0] / 3)][posi[p][1] / 3][posi[p][2] - 1] = 0;
				++posi[p][2];
			}
		}
		for (p = 0; p<emp; ++p){
			board[posi[p][0]][posi[p][1]] = posi[p][2] + '0';
		}
	}
	bool isValid(int i, int j, int num){
		return !(row[i][num] || col[j][num] || sq[i / 3][j / 3][num]);
	}
};

回溯用数组代替栈,用3*81维数组代替structure。

难度不大,不用剪枝,当然剪枝会快一些。相当于是暴力+贪心。


你可能感兴趣的:(LeetCode,table,hash,backtracking,OJ)