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