数独游戏的简单回溯解法

原创 2015年11月18日 23:28:53

今天哥们儿突然让我帮着解个数独,一开始以为只要循环遍历就可以了,后来想想有些太麻烦,想着自己以前写过八皇后问题,研究了一下,还真弄出来了,高兴!

#include <iostream>
#include <fstream>
int num[9][9];
int posX[81]= {0};
int posY[81]= {0};
int resCount=0;
using namespace std;
void print()
{
    for(int i=0; i<9; i++)
    {

        for(int j=0; j<9; j++)
        {
            cout<<num[i][j]<<" ";
        }
        cout<<endl;
    }
}
void recordPos() //记录还没有添加数字的位置
{
    for(int i=0; i<9; i++)
    {
        for(int j=0; j<9; j++)
        {
            if(num[i][j]==0)
            {
                posX[resCount]=i;
                posY[resCount]=j;
                resCount++;
            }
        }
    }
}
bool checkZone(int x,int y)//检测该数在自己3*3的方格是否合法
{
    int tmpX = 3*(x/3);
    int tmpY = 3*(y/3);
    for(int i=tmpX; i<tmpX+3; ++i)
    {
        for(int j=tmpY; j<tmpY+3; ++j)
        {
            if(x==i&&j==y)continue;
            if(num[x][y]==num[i][j])return false;
        }
    }
    return true;
}
bool check(int step) //检测是否合法
{
    int x=posX[step];
    int y=posY[step];
    for(int i=0; i<9; i++) //行重复
    {
        if(num[x][y]==num[x][i]&&y!=i)return false;
    }
    for(int i=0; i<9; i++) //列重复
    {
        if(num[x][y]==num[i][y]&&x!=i)return false;
    }
    if(!checkZone(x,y))return false;
    return true;
}
void f(int step)
{
    if(step==resCount)
    {
        print();
        return ;
    }
    for(int i=1; i<=9; i++)
    {
        num[posX[step]][posY[step]]=i;
        if(check(step))
        {
            f(step+1);
        }
        num[posX[step]][posY[step]]=0;
    }
}
int main()
{
    freopen("in.txt","r",stdin);
    for(int i=0; i<9; i++)
    {
        for(int j=0; j<9; j++)
        {
            cin>>num[i][j];
        }
    }
    recordPos();
    f(0);
    return 0;
}
测试用例:

2 0 6 0 0 1 0 8 0
1 7 0 0 0 9 0 6 0
0 0 0 4 6 7 0 0 0
6 1 0 0 4 0 8 0 0
0 0 2 0 0 0 3 0 0
0 0 5 0 0 0 0 9 6
0 0 0 2 1 5 0 0 0
0 3 0 6 9 4 0 2 8
0 2 0 7 0 0 6 0 5




C回溯算法高效解标准数独

C回溯算法高效解标准数独
  • huang826336127
  • huang826336127
  • 2017年04月03日 13:15
  • 14569

哭吧!喜欢玩数独游戏的亲们!你被取代了——C语言解数独

当时大学新买的Nokia手机上有这个游戏,玩着玩着突然想能不能写个程序来解题,因为当时在学C语言,于是乎…… 原文在QQ空间,现在整理到CSDN上供大家吐槽先上代码#include #include...
  • xmh19936688
  • xmh19936688
  • 2016年06月12日 14:36
  • 2790

数独解法的Python实现

import itertoolssudoku = [[0,0,0,4,0,8,0,0,0], [5,2,0,9,0,6,0,4,1], [7,8,0,2,0,3...
  • zonnin
  • zonnin
  • 2017年12月15日 15:35
  • 84

数独之Skyscraper

Skyscraper(摩天楼) 绿色表示8可以出现的位置。可以观察r2c2,r2c5,r7c1,r7c5四个位置的8 可以观察,如果A不是8,则B一定是8,则D一定不是8,则C一定是8. ...
  • magicnumber
  • magicnumber
  • 2012年12月27日 19:54
  • 1659

C语言 递归(回溯) 解决数独问题

基本思路: 利用dfs的思想,让程序自动检测未填入的格子,填入格子的顺序按照先行后列依次填入,不满足条件就回溯到上一格,重新检测可填入的数再进行填入。其中可填入的条件按照一般做数独的方法,若此格为空,...
  • lauraliu123
  • lauraliu123
  • 2017年02月04日 11:39
  • 683

规则数独和不规则数独的并

规则数独和不规则数独的并
  • nameofcsdn
  • nameofcsdn
  • 2016年10月20日 00:31
  • 2137

一秒内破解“最难数独”

网上看到一则新闻,江苏69岁农民3天破解“世界最难数独”,我也写了个程序破解该数独。 原报道截图如下: 原题如下:   运行结果:     #include #inclu...
  • stephen_xupeng
  • stephen_xupeng
  • 2013年05月29日 23:17
  • 499

[人工智能]回溯算法解数独

今天在AI课上学了CSP,然后学了回溯算法。所以就用回溯算法来解数独吧。 数独问题可以把九九八十一个格简化为81个变量,每一个变量可以取1-9的值,当然,一开始初始化的值是不可以改变的。然后呢,对于...
  • xmb24
  • xmb24
  • 2017年10月25日 17:06
  • 141

回溯法解数独游戏

前言采用回溯法最经典的例子是解决8皇后和迷宫的问题。不习惯走别人的路,所以下面介绍下用回溯法解数独游戏。写这个算法的起因是之前在玩数独游戏时,遇到了难解的专家模式,就想着写程序来暴力破解,是不是很无赖...
  • flueky
  • flueky
  • 2016年04月08日 17:40
  • 1377

C语言实现的数独解题程序

用最暴力的递归方式在所有可能的空间中寻找数独的解法。试了一下,不管多难的数独都能在1s内找到所有答案,所以也没有采取更智能的算法进行优化,如加入人的逻辑推理算法。 这里只是把一种最笨的方法分享出来,...
  • happyAnger6
  • happyAnger6
  • 2015年01月31日 22:46
  • 11878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数独游戏的简单回溯解法
举报原因:
原因补充:

(最多只允许输入30个字)