数独

描述
数独游戏规则 
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。 
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
 
输入
一个9*9的矩阵,0表示该位置是空白。
 
输出
一个9*9的矩阵,格式与输入类似。
 
输入样例
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
 
输出样例
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854

#include <iostream>

using namespace std;

char a[9][9];


bool legal(int x, int y, char v)
{
    for(int i = 0; i < 9; i++)
    {
        if(i != x && a[i][y] == v)		//同一列
            return false;
        if(i != y && a[x][i] == v)		//同一行
            return false;
    }
    int xx = x/3*3;
    int yy = y/3*3;
    for(int i = xx; i < xx+3; i++)		//同一宫	
    {
        for(int j = yy; j < yy+3; j++)
        {
			if(i != x && j != y && a[i][j] == v)
                return false;
        }
    }
    return true;
}
void dfs(int k)
{
    if(k == 81)
    {
        for(int i = 0; i < 9; i ++)
		{
			for(int j = 0; j < 9; j++)
			{
				cout <<  a[i][j];
			}
			cout << endl;
		}
		return;
    }
    int x = k/9;
    int y = k%9;
    if(a[x][y] == '0')
    {
        for(int i = 1; i <= 9; i++)
        {
            a[x][y] = '0'+i;
            if(legal(x, y, a[x][y]))
                dfs(k+1);
        }
		a[x][y] = '0';					//回溯关键,考试的时候没有想到
    }
    else
        dfs(k+1);
}
int main()
{
    for(int i = 0; i < 9; i ++)
    {
        for(int j = 0; j < 9; j++)
        {
            cin >> a[i][j];
        }
    }
    dfs(0);
    
	system("pause");
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值