#include<iostream>
#include <vector>
#include <fstream>
using namespace std;
bool isValid(std::vector<std::vector<int>> &chess,
int x,int y,int val){
bool ret=true;
for(int j=0;j<9;j++){
if(j==y) continue;
if(val==chess.at(x).at(j)){
ret=false;
return ret;
}
}
for(int i=0;i<9;i++){
if(i==x) continue;
if(val==chess.at(i).at(y)){
ret=false;
return ret;
}
}
int new_x=x/3,new_y=y/3;
int tl_x=new_x*3,tl_y=new_y*3;
for(int i=tl_x;i<tl_x+3;i++){
for(int j=tl_y;j<tl_y+3;j++){
if(i==x&&j==y){
continue;
}
if(val==chess.at(i).at(j)){
ret=false;
return ret;
}
}
}
return true;
}
struct Pos{
Pos(int i,int j):x(i),y(j),val(0){}
int x;
int y;
int val;
};
class Solution{
public:
bool backTracking(std::vector<std::vector<int>> &matrix,
std::vector<Pos>& pos,int n){
bool ret=false;
if(n==pos.size()){
return true;
}
for(int i=1;i<=9;i++){
pos.at(n).val=i;
if(isValid(matrix,pos.at(n).x,pos.at(n).y,i)){
matrix.at(pos.at(n).x).at(pos.at(n).y)=i;
ret=backTracking(matrix,pos,n+1);
if(ret){
break;
}else{
matrix.at(pos.at(n).x).at(pos.at(n).y)=0;
}
}
}
return ret;
}
void findSolution(std::vector<std::vector<int>> &matrix,
std::vector<Pos>& pos){
bool ret=false;
for(int i=1;i<=9;i++){
pos.at(0).val=i;
if(isValid(matrix,pos.at(0).x,pos.at(0).y,i)){
matrix.at(pos.at(0).x).at(pos.at(0).y)=i;
ret=backTracking(matrix,pos,1);
if(ret){
break;
}else{
matrix.at(pos.at(0).x).at(pos.at(0).y)=0;
}
}
}
if(ret){
int len=pos.size();
for(int i=0;i<len;i++){
matrix.at(pos.at(i).x).at(pos.at(i).y)
=pos.at(i).val;
}
}
}
};
int main(){
//std::ifstream in("data.txt");
//std::streambuf *cinbackup;
//cinbackup=cin.rdbuf(in.rdbuf());
std::vector<std::vector<int>> matrix;
matrix.resize(9,std::vector<int>());
std::vector<Pos> zero_pos;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
int num;
std::cin>>num;
matrix.at(i).push_back(num);
if(0==num){
zero_pos.push_back(Pos(i,j));
}
}
}
Solution so;
so.findSolution(matrix,zero_pos);
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(8==j){
std::cout<<matrix.at(i).at(j)<<std::endl;
}else{
std::cout<<matrix.at(i).at(j)<<" ";
}
}
}
return 0;
}
数独-Sudoku
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 数独是一种小游戏。规则是在一个9*9或者其他型号的板子上填数字,必须满足三个要求:1.每一个横排的9个空格必须是1...
- LeetCode上有一道数独题,https://leetcode.com/problems/sudoku-solv...
- 37. 解数独 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每...