数独-Sudoku
2022-07-18 本文已影响0人
help_youself
#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;
}