《编程之美》1.15节:构造数独
构造一个9*9的矩阵,其中每一行都是1-9,每一列也是1-9,9个3*3的子方格中也是1-9。
解:用回溯法,往当前格中填数字,如果满足就进行下一个格子,如果不满足就尝试下一个数,如果9个数都不满足,就回溯到前一个方格中,用下一个数继续尝试。
#include<iostream>
#include<vector>
using namespace std;
//判断行、列和3*3的格中是否有重复
bool isValid(vector<vector<int> > &matrix,int row,int col,int num)
{
for(int i=0;i<9;i++)//判断row行和col列是不是有重复,如果有返回false
{
if(matrix[i][col]==num && i!=row)
return false;
if(matrix[row][i]==num && i!=col)
return false;
}
//判断3*3的格子中是否有重复
for(int i=3*(row/3);i<3*(row/3)+3;i++)
for(int j=3*(col/3);j<3*(col/3)+3;j++)
if(matrix[i][j]==num && i!=row && j!=col)
return false;
}
bool generateMatrix(vector<vector<int> > &matrix,int row,int col)
{
if(row>8 || col>8)
return true;
for(int k=1;k<=9;k++)
{
if(isValid(matrix,row,col,k))
{
matrix[row][col]=k;
if(col==8)
{
if(generateMatrix(matrix,row+1,0))
return true;
}
else
{
if(generateMatrix(matrix,row,col+1))
return true;
}
}
matrix[row][col]=0;
}
return false;
}
int main()
{
vector<vector<int> > matrix(9,vector<int>(9,0));
generateMatrix(matrix,0,0);
system("pause");
return 0;
}