构造数独

《编程之美》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;  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值