暴力求解数独


早上做了一个”高级“难度的数独发现真是难到爆炸,于是乎决定写一个暴力程序枚举一下,于是出现此文。
思路很简单,深搜即可,每次check一下,不行就回溯。
话不多说,很简单,直接上代码。

/*
About: sudoku 
Auther: kongse_qi
Date:2017/05/03
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>

#define maxn 9

#define read(x) scanf("%d", &x)

int x[maxn][maxn];

void Read()
{
    for(int i = 0; i != maxn; ++i)
    {
        for(int j = 0; j != maxn; ++j)
        {
            read(x[i][j]);
        }
    }
    return ;
}

bool Check(int a, int b, int n)
{
    for(int i = 0; i != maxn; ++i)
    {
        if(x[a][i] == n && i != b)  return false;
    }
    for(int i = 0; i != maxn; ++i)
    {
        if(x[i][b] == n && i != a)  return false;
    }
    for(int i = a/3*3; i != a/3*3+3; ++i)
    {
        for(int j = b/3*3; j != b/3*3+3; ++j)
        {
            if(x[i][j] == n && (i != a || b != j))  return false;
        }
    }
    return true;    
}

void Print()
{
    for(int i = 0; i != maxn; ++i)
    {
        for(int j = 0; j != maxn; ++j)
        {
            printf("%d ", x[i][j]);
        }
        printf("\n");
    }
    return ;
}

bool Dfs(int tot)
{
    if(tot > 80)
    {
        return true; 
    }
    int curx = tot/9, cury = tot%9;
    if(!x[curx][cury])
    {
        for(int i = 1; i != 10; ++i)
        {
            x[curx][cury] = i;
            if(Check(curx, cury, i))
            {
                if(Dfs(tot+1))  return true;
            }
            x[curx][cury] = 0;
        }
    }
    else return Dfs(tot+1);
    return false;
}
int main()
{
    freopen("test.in", "r", stdin); 
    Read();
    Dfs(0);
    Print();
    return 0;
}

水了一篇…
箜瑟_qi 2017/05/05 11:55

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值