数独游戏的简单回溯解法

原创 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




相关文章推荐

数独求解算法(回溯法和唯一解法)java实现

数独(すうどく,Sudoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余 空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。    ...

java实现简单数独游戏

本来打算晚上把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用,非洲人非了一天... 数独代码是在之前寒假受命写的,学了一个月java的成果,现在看来...
  • Wyx_wx
  • Wyx_wx
  • 2017年06月21日 20:21
  • 767

数独游戏的算法,代码超简单

  • 2011年09月21日 17:26
  • 1.82MB
  • 下载

一个简单的数独游戏

  • 2016年10月14日 23:02
  • 37KB
  • 下载

数独游戏(sudoku)算法 回溯+剪枝

具体数独游戏是什么,我就不介绍了,好像多余了,你能来看这篇文章,说明你对数独游戏已经有了相当的了解了!还是入正题吧,今天先讲解和发下用回溯+剪枝 求数独游戏,我也看了些回溯+剪枝求数独的算法,很恼火,...
  • hehui86
  • hehui86
  • 2011年05月08日 16:09
  • 1221

简单的数独小游戏

  • 2013年06月11日 11:19
  • 1.99MB
  • 下载

传统数独解法 matlab

  • 2015年05月18日 17:29
  • 3KB
  • 下载

谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)

今天做了一下谷歌2013年校园招聘第二轮机试题,自己独立把程序写出来并且调试通过。        原题网址:https://code.google.com/codejam/contest/29294...

数独解法生成

  • 2013年07月08日 21:03
  • 157KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数独游戏的简单回溯解法
举报原因:
原因补充:

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