Sukudo问题

/*
问题描述:
sukudo棋盘是一种逻辑游戏,是一种9*9的网格,要求满足一行,每一列,每个3*3的子网格都是由1-9九个数字组成,
每个子网格填充的数字都不重复,给定一个9*9的二维数组,给出满足条件的填充算法。
来源:网易算法课
说明:
采用一维启发式搜索算法,对于当前的位置,遍历1-9九个数字,如果找到满足条件的数字就继续走下一步,
如果找不到合适的数字则退回上一步,另外选取一个数字,再次查找是否有符合当前位置的数字,如果还没有,则继续退回上一步。

*/

#include <iostream>
using namespace std;

class sukudo
{
public:
	sukudo();
	//构造函数
	void printSukudoBoard();
	//打印数组元素
	bool checkValid(int i, int j, int val);
	//检查(x,y)位置处是否可行
	bool setSukudoBoard(int x, int y);

private:
	int sukudoBoard[9][9];
};

sukudo::sukudo()
{
	if (setSukudoBoard(0, 0))
	{
		printSukudoBoard();
	}
	else
		cout << "No answer" << endl;
}

void sukudo::printSukudoBoard()
{
	int i, j;
	for (i = 0; i < 9; i++)
	{
		for (j = 0; j < 9; j++)
		{
			cout << sukudoBoard[i][j] << " ";
		}
		cout << endl;
	}
}

bool sukudo::checkValid(int i, int j, int val)
{
	int k, p, q;

	for (k = 0; k < 9; k++)//检查行和列是否有重复
	{
		if (k != j && sukudoBoard[i][k] == val)
			return false;
		if (k != i && sukudoBoard[k][j] == val)
			return false;
	}
	//检查每个子网格内的数字是否重复
	int subX = (i / 3) * 3, subY = (j / 3) * 3;
	for (p = subX; p < subX + 3; p++)
	{
		for (q = subY; q < subY + 3; q++)
		{
			if (p != i && q != j && sukudoBoard[p][q] == val)
				return false;
		}
	}

	return true;
}

bool sukudo::setSukudoBoard(int x, int y)
{
	
	int val;
	if (y >= 9)//换一行
	{
		y = 0;
		x++;
	}

	if (x >= 9)//完成全部的填充
	{
		return true;
	}

	for (val = 1; val <= 9; val++)
	{
		if (checkValid(x, y, val))//判断该位置是否可行
		{
			sukudoBoard[x][y] = val;
			if (setSukudoBoard(x, y + 1))
				return true;
		}

	}
	sukudoBoard[x][y] = 0;
	return false;

}

int main()
{
	sukudo s;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值