数独(Sudoku)求解程序

/* 数独完全求解程序 Ver 3.0 */
/* coolypf */
/* 2008-11-24 22:11 */
#include <iostream>
using namespace std;
int matrix[9][9];  /*数独矩阵*/
int count = 0;     /*解的个数*/
int check(int x, int y, bool mark[10]) /*检测matrix[x][y]的取值范围*/
{
  int i, j, c = 0;
  for(i = 1; i <= 9; ++i)
  {
    mark[i] = true;
  }
  for(i = 0; i < 9; ++i)
  {
    mark[matrix[x][i]] = false;
  }
  for(i = 0; i < 9; ++i)
  {
    mark[matrix[i][y]] = false;
  }
  x = x / 3 * 3;
  y = y / 3 * 3;
  for(i = 0; i < 3; ++i)
  {
    for(j = 0; j < 3; ++j)
    {
      mark[matrix[x + i][y + j]] = false;
    }
  }
  for(i = 1; i <= 9; ++i)
  {
    if(mark[i]) ++c;
  }
  return c;
}
void display()  /*输出解*/
{
  int x, y;
  cout << "Solution " << count << ":\n";
  for(x = 0; x < 9; ++x)
  {
    for(y = 0; y < 9; ++y)
    {
      cout << matrix[x][y] <<' ';
    }
    cout << endl;
  }
}
void sudoku()  /*求解数独*/
{
  bool mark[10];  /*matrix中元素的取值范围*/
  int x, y, xm=-1, ym, min=10, c;
  for(x = 0 ; x < 9; ++x)  /*检测取值范围最小的空格*/
  {
    for(y = 0; y < 9; ++y)
    {
      if(matrix[x][y]) continue;  /*非空格则跳过*/
      c = check(x, y, mark);
      if(c == 0) return;  /*不可解*/
      if(c < min)
      {
        min = c;
        xm = x;
        ym = y;
      }
    }
  }
  if(xm == -1)  /*matrix填完*/
  {
    ++count;
    display();
    return;
  }
  check(xm, ym, mark);
  for(x=1; x <= 9; ++x)
  {
    if(mark[x])
    {
      matrix[xm][ym] = x;  /*尝试*/
      sudoku();  /*递归*/
    }
  }
  matrix[xm][ym]=0;  /*回溯*/
}
int main()
{
  int x, y;
  for(x=0;x <9; ++x)  /*输入数独*/
  {
    for(y=0; y<9; ++y)
    {
      cin >> matrix[x][y];
    }
  }
  sudoku();  /*求解数独*/
  cout << endl << count << " solution(s) in total.\n";
  return 0;
}
程序说明: Matrix Sudoku Solver 解独矩阵是一款计算机模拟人工思路求解数独程序。它能利用大部分的人工解法完成对简单、中等、困难、专家以及骨灰级的数独求解。玩家可以将需要求解数独输入矩阵后,按照提示或结合逻辑求解,也可以按下自动按钮,让程序帮您完成剩下的求解工作,并在得到正确的求解数独后,自动将求解步骤复制到剪贴板,让您可以在其他文本编辑器中粘贴查看,十分的人性化。 功能介绍: 为方便用户使用,本程序分为菜单栏,主界面功能按钮,底部面板提示区。 菜单栏功能介绍: 》选项: 清空:将主界面数独矩阵清空,程序回到初始界面。 读取:读取已存盘的数独文件,并将其显示在主界面数独矩阵中。 保存:保存当前主界面数独,将所有值存档。 启用TTS语音提示:该选项可以开启语音提示功能,开启后程序将自动读出程序底部面板提示区的内容。开启前请确认系统中是否已安装TTS语音引擎。若没有安装,请到微软TTS官网下载语音引擎。 退出:退出程序 》解题: 锁定已知数:将已填入的初局数独锁定,准备求解。 显示候选数提示:开启后鼠标在某个格子悬停会出现该格可以填入的候选数。 提示值自动填入:开启后按下提示按钮会自动将提示值填入格内。 按步提示:锁定后可用,提示当前数独如何求解 自动解题:锁定后可用,自动求解当前数独。 强制求解:锁定后可用,可对无法用自动求解完成的数独进行强制求解程序必会返回可解或不可解的结果。 重做:锁定后可用,将所有未锁定的值清空。 》主题: 本程序提供多种主题界面选择,让玩家在自己喜爱的主题中求解数独。除了程序自带的五种主题,用户还可以自定义背景,选择自己喜欢的图片作为程序背景。 》帮助: 数独简介:介绍数独由来,发展,规则介绍 程序说明:程序的介绍,程序功能的说明 解法介绍:介绍程序中使用及尚未加入的一些数独逻辑求解方法。 关于:程序信息,开发组信息 主界面功能按钮介绍: 提示:同菜单《解题》中的《按步提示》 锁定:同菜单《锁定》中的《锁定已知数》 保存:同菜单《选项》中的《保存》 读取:同菜单《选项》中的《读取》 重做:同菜单《解题》中的《重做》 清空:同菜单《选项》中的《清空》 自动:同菜单《解题》中的《自动解题》 提示候选数:同菜单《解题》中的《显示候选数提示》 底部面板提示区介绍: 程序求解数独的全部提示信息将全部显示在此处。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值