数独游戏设计与源码

合集下载

数独代码源码

数独代码源码
number_bitmap[1] = BitmapFactory.decodeResource(getResources(), R.drawable.b1); //1的图标
number_bitmap[2] = BitmapFactory.decodeResource(getResources(), R.drawable.b2);//2的图标
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Content extends Activity{
Button start;
Button help;
Button exit;
GameView gameView;//游戏界面的引用
@Override
protected void onCreate(Bundle savedInstanceState) {
key_background = BitmapFactory.decodeResource(getResources(), R.drawable.key_background);
number_bitmap[0] = BitmapFactory.decodeResource(getResources(), R.drawable.b0);//0的图标
}
private class AccessToNext implements OnClickListener {

数独问题高效算法的设计与实现

数独问题高效算法的设计与实现

数独问题高效算法的设计与实现数独是一种经典的逻辑推理游戏,是一种求解问题的算法设计与实现的典型案例。

数独棋盘是一个9×9的网格,其中的部分格已经填入了数字,在其他的空格中,必须填入1到9的数字,要求每一行、每一列和每一个3×3的九宫格内的数字均不重复。

数独问题的高效算法设计与实现可以从以下几个方面进行思考和实践。

1. 数独问题建模:首先,需要将数独问题进行建模。

可以使用二维数组来表示数独棋盘,其中已经填入数字的格子用数字表示,空格用0表示。

例如,数独棋盘可以表示为一个9×9的二维数组。

建模完成后,可以通过输入参数的方式读取数独问题。

2. 空格位置查找:数独问题的求解首先需要找到空格的位置。

可以采用遍历数独棋盘的方式,对每一个位置进行判断,如果数值为0,则该位置是一个空格。

可以通过双重循环来实现该功能。

3. 数字的合法性判断:在填充数字之前,需要判断待填入的数字是否合法。

合法的数字满足以下条件:在所在行中没有重复数字,所在列中没有重复数字,所在3×3九宫格中没有重复数字。

可以通过遍历所在行、列和九宫格的方式来判断数字的合法性。

4. 回溯算法:数独问题的求解可以使用回溯算法。

回溯算法是一种逐步试错的方法,通过尝试不同的数字,直到找到合适的解。

可以从数独棋盘的空格位置开始,逐个尝试填入数字,并判断数字的合法性。

如果遇到不合法的情况,则回溯到上一个位置继续尝试。

可以使用递归实现回溯算法。

5. 数独问题的解输出:在求解完数独问题后,需要输出数独棋盘的解。

可以通过遍历数独棋盘的方式,依次输出每个位置的数字。

在实现数独问题的高效算法时,可以考虑使用优化的数据结构和算法,以提高求解效率。

可以使用位运算来表示数字的合法性,减少时间和空间复杂度。

可以使用哈希表来记录已经填入的数字,以快速判断数字的合法性。

可以使用剪枝技术,减少无效的尝试,提高算法的效率。

除了基础的算法设计,还可以考虑一些优化技巧。

c语言数独游戏程序(ClanguageSudokuprogram)

c语言数独游戏程序(ClanguageSudokuprogram)

c语言数独游戏程序(C language Sudoku program)/ * **数独程序* /公共类的蜀都{/ * * /存储数字的数组静态int [] = n =新int [ 9 ] [] 9 ];/ * * /生成随机数字的源数组,随机数字从该数组中产生static int [] num = { 1,2,3,4,5,6,7,8,9 };public static void main(String [] args){/ /生成数字对于(int = i 0;i < 9;i + +){/ /尝试填充的数字次数int时间= 0;/ /填充数字对于(int = 0;j<9;j + +){/ /产生数字n [我] [ J ] = generatenum(时间);/ /如果返回值为0,则代表卡住,退回处理/ /退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列如果(n i = j = 0){/ /不是第一列,则倒退一列如果(j = 0){J=2;继续;}否则{ //是第一列,则倒退到上一行的最后一列我--;j=8;继续;}}/ /填充成功如果(iscorret(i,j)){/ /初始化时间,为下一次填充做准备时间= 0;} { //继续填充其他次数增加/ / 1时间+;/ /继续填充当前格J;}}}/ /输出结果对于(int = i 0;i < 9;i + +){ 对于(int = 0;j<9;j + +){系统。

输出;}系统println()。

出去;}}/ * **是否满足行、列和3x3区域不重复的要求* @param排行号* @param Col列号* @还真代表符合要求* /公共静态布尔iscorret(行,int型){返回(检验行(列)与这种(COL)和checknine(行,列));}/ * **检查行是否符合要求* @param排检查的行号* @还真代表符合要求* /公共静态布尔检验行(行){对于(int = 0;j<8;j + +){如果(n行= j = 0){继续;}for (int k = j + 1, k < 9; k + +) { if (n [row] [j] = = n [row] [k]) { return false;}}}return true;}/ * ** 检查列是否符合要求* @ param col 检查的列号* @ return true代表符合要求* /public static boolean checkline (int col) { for (int j = 0 and j < 8; j + +) {if (n [j] [col] = = 0) {continue;}for (int k = j + 1, k < 9; k + +) {if (n [j] [col] = = n [c] [col]) {return false;}}return true;}/ * ** 检查3x3区域是否符合要求* @ param row 检查的行号* @ param col 检查的列号* @ return true代表符合要求* /public static boolean checknine (int row, int col) { / / 获得左上角的坐标int j = row / 3 * 3;int c = col / 3 * 3;/ / 循环比较for (int i = 0; i < 8; i + +) {if (n [j + i / 3] [k + in% 3] = = 0) {continue;}for (int m = i + 1; m < 9; m + +) {if (n [j + i / 3] [k +] in% 3 = = n [j + m / 3] [k + m% 3]) {return false;}}}return true;}/ * ** 产生1 - 9之间的随机数字* 规则: 生成的随机数字放置在数组8 - time下标的位置, 随着time的增加, 已经尝试过的数字将不会在取到* 说明: 即第一次次是从所有数字中随机, 第二次时从前八个数字中随机, 依次类推,* 这样既保证随机, 也不会再重复取已经不符合要求的数字, 提高程序的效率* 这个规则是本算法的核心* @ param time 填充的次数, 0代表第一次填充* @ return* /public static int generatenum (int a) {/ / 第一次尝试时, 初始化随机数字源数组if (a = = 0) {for (int i = 0; i < 9; i + +) {num [in] = in + 1;}}/ / 第10次填充, 表明该位置已经卡住, 则返回0, 由主程序处理退回if (a = = 9) {return 0;}/ / 不是第一次填充/ / 生成随机数字, 该数字是数组的下标,The number corresponding to the subscript in the array num is a random numberInt ranNum = (int) (Math.random () * (9 - time));/ / put the numbers placed in the penultimate position of a time array,Int temp = num[8 - time];Num[8 - time] = num[ranNum];Num[ranNum] = temp;/ / return the numberReturn num[8 - time];}}。

数独程序设计

数独程序设计

数独程序设计数独是一种源自日本的数字逻辑游戏,其规则是在一个9x9的网格中填入数字1到9,使得每行、每列以及每个3x3的子网格内都包含1到9的所有数字,且不重复。

设计一个数独程序,需要考虑如何生成数独谜题、如何验证数独解的正确性以及如何实现自动解决数独谜题的算法。

数独程序设计概述数独程序设计可以分为以下几个主要部分:1. 界面设计:用户与程序交互的界面,包括输入谜题、显示谜题、提交解和显示解等。

2. 谜题生成:算法生成数独谜题,通常需要保证谜题有一个唯一的解。

3. 解的验证:算法验证用户提交的数独解是否正确。

4. 自动解题算法:算法自动解决数独谜题,常见的有回溯法等。

界面设计界面设计应简洁明了,提供必要的输入输出功能。

用户可以通过文本框输入数独谜题的初始布局,也可以通过图形界面直接点击格子输入数字。

提交解后,程序应能即时反馈解的正确性。

谜题生成生成数独谜题的算法通常包括以下步骤:- 随机生成一个完整的数独解。

- 逐步移除一些数字,直到剩余的数字数量达到所需的难度级别。

- 确保移除数字后的谜题仍然有一个唯一的解。

生成算法需要使用到数独解的唯一性检测,这可以通过回溯法等算法来实现。

解的验证验证数独解的正确性,需要检查以下条件:- 每一行的数字1到9是否都出现且只出现一次。

- 每一列的数字1到9是否都出现且只出现一次。

- 每一个3x3的子网格内的数字1到9是否都出现且只出现一次。

自动解题算法自动解题算法中,回溯法是一种常用的方法,其基本思想是:1. 从左到右,从上到下遍历数独的每一个格子。

2. 对于每一个空格子,尝试填入1到9的数字。

3. 每填入一个数字后,检查当前的数独布局是否满足数独的规则。

4. 如果当前布局满足规则,则递归地尝试填入下一个空格子。

5. 如果当前布局不满足规则,或者已经尝试了所有可能的数字,则回溯到上一个空格子,尝试填入下一个数字。

6. 如果所有格子都被正确填满,则找到了一个解。

程序实现在程序实现时,可以使用多种编程语言,如Python、Java或C++。

数独问题高效算法的设计与实现

数独问题高效算法的设计与实现

数独问题高效算法的设计与实现一、引言数独是一种经典的逻辑游戏,它的规则简单易懂,但是解题难度却不低。

在实际应用中,数独问题也被广泛运用于密码学、人工智能等领域。

本文将介绍数独问题高效算法的设计与实现。

二、数独问题的基本原理数独游戏是在一个9*9的方格中填入数字1-9,使得每行、每列和每个小九宫格内都恰好包含1-9这些数字。

其中,已经填好的数字称为已知数,需要填写的数字称为未知数。

解题过程就是找到所有未知数的正确填法。

三、暴力搜索算法暴力搜索算法是一种朴素的解题方法,其思路是枚举所有未知数可能取到的值,并检查其是否符合规则。

具体步骤如下:(1)从左到右、从上到下遍历整个棋盘。

(2)对于每一个未知数,枚举其可能取到的值,并检查是否符合规则。

(3)如果符合规则,则继续往下遍历;如果不符合规则,则回溯到上一个未知数重新尝试。

暴力搜索算法虽然简单易懂,但是其时间复杂度非常高,难以处理大规模的数独问题。

因此,我们需要更高效的算法来解决这个问题。

四、DLX算法DLX(Dancing Links)算法是Donald E. Knuth在他的《The Art of Computer Programming》中提出的一种高效的精确覆盖算法。

它可以解决多种组合优化问题,包括数独问题。

DLX算法的基本思路是将问题转化为一个精确覆盖问题,并使用回溯和剪枝技术来求解。

具体步骤如下:(1)将数独问题转化为一个精确覆盖问题。

(2)使用Dancing Links数据结构来表示精确覆盖问题,并用回溯和剪枝技术来求解。

(3)对于每个未知数,在其可能取到的值中选择一个值进行填写,并更新DLX数据结构。

(4)如果当前填写符合规则,则继续往下搜索;如果不符合规则,则回溯到上一个未知数重新尝试。

DLX算法具有时间复杂度为O(9^(n^2)),空间复杂度为O(n^4)的优点,可以在较短时间内求解大规模数独问题。

五、SAT求解器SAT(Satisfiability)求解器是一种能够自动求解布尔逻辑问题的程序,其基本思路是将问题转化为一个布尔公式,并使用SAT算法来求解。

幼儿园中班益智游戏《数独》教案解析

幼儿园中班益智游戏《数独》教案解析

《数独》教案解析一、引言在幼儿园的中班阶段,益智游戏的教学起着非常重要的作用。

而《数独》作为一款经典的益智游戏,不仅能够培养幼儿的逻辑思维能力,还能锻炼他们的耐心和集中注意力的能力。

本文将对《数独》游戏进行教案解析,并探讨如何在幼儿园中班教学中有效地引入这个游戏,以促进幼儿的综合发展。

二、《数独》教案解析1. 游戏简介《数独》是一款源自日本的益智游戏,游戏板由9×9的网格组成,被划分为9个3×3的小网格。

游戏规则是在每一行、每一列和每个小网格内填入数字1-9,使得每个数字在每一行、每一列和每个小网格内都只出现一次。

这个游戏能够锻炼幼儿的逻辑思维和空间想象能力,对幼儿的认知发展有积极的影响。

2. 教学目标通过《数独》游戏的教学,帮助幼儿培养逻辑思维能力、空间想象能力和集中注意力的能力,同时锻炼他们的耐心和毅力,培养他们解决问题的能力,并培养他们的合作意识和竞争意识。

3. 教学内容采用形式多样的教学内容,引导幼儿逐步学习《数独》游戏的规则、技巧和策略。

可以从简单的9×9网格开始,让幼儿体验填数字的乐趣,逐渐引导他们理解每一行、每一列和每个小网格内数字的唯一性。

还可以通过特定形状的木块或拼图,让幼儿在实物中感知数字的排列规律,从而培养他们的空间想象能力。

4. 教学方法在教学过程中,可以采用多种教学方法,如情境教学法、游戏教学法和合作教学法。

情境教学法能够让幼儿在情境中体验《数独》游戏的乐趣,激发他们的学习兴趣;游戏教学法能够让幼儿在游戏中学习规则和技巧,通过实践获得经验;合作教学法能够让幼儿在小组中相互配合,共同解决难题,培养他们的合作意识和竞争意识。

5. 教学流程在教学过程中,要根据幼儿的芳龄特点和学习需求,合理安排教学流程。

可以首先通过课堂讲解介绍《数独》游戏的规则和技巧,然后引导幼儿通过实际操作体验游戏乐趣,最后开展小组合作或比赛活动,让幼儿在竞争中共同提高。

6. 教学评估在教学过程中要及时对幼儿的学习情况进行评估,采用多种评估方法,如观察记录、测试测验和作品展示等。

中班益智游戏《数独》教案适用于幼儿园

中班益智游戏《数独》教案适用于幼儿园标题:培养幼儿逻辑思维与数学能力的益智游戏——数独引言:数独是一种经典的益智游戏,它不仅能够培养幼儿的逻辑思维和数学能力,同时也能增强幼儿的观察能力和耐心。

本文将介绍中班幼儿园适用的数独教案,旨在帮助幼儿在玩乐中体验数学的乐趣,并激发他们的学习兴趣。

第一部分:数独概述1.1 数独的定义和起源数独是一款由9x9方格组成的游戏板,其中一些方格预先填入了数字。

玩家需要根据游戏规则,在未填入数字的方格中填入1至9的数字,保证每一行、每一列以及每个3x3的小格子内都不重复出现相同的数字。

数独最初起源于18世纪瑞士,如今已经成为全球流行的智力游戏。

1.2 数独对幼儿的益处数独对中班幼儿的发展有许多益处。

通过数独游戏,幼儿可以培养逻辑思维能力,训练他们在解决问题时的推理和分析能力。

数独能够提升幼儿的数学能力,加深他们对数字、集合和数学运算的理解。

数独对于培养幼儿耐心和专注力也大有裨益。

第二部分:中班数独教案设计2.1 教学目标根据中班幼儿的认知特点和学习需求,我们设计了以下教学目标:- 掌握数独游戏的规则和基本操作方法。

- 培养幼儿观察问题、分析问题和解决问题的能力。

- 强化幼儿的数字概念和数学运算能力。

2.2 教学内容与活动为了达到以上教学目标,我们设计了一系列的教学内容与活动:- 介绍数独游戏的规则和方法,并通过展示实际游戏板和数字卡片的形式,引发幼儿的兴趣。

- 制作简化的数独游戏板,通过幼儿自主填充数字,培养他们的观察力和逻辑思维。

- 引导幼儿通过试错的方式解决数独难题,培养他们的问题解决能力和耐心。

- 进一步加深幼儿对数字的理解,结合数独游戏进行简单的数学运算练习,如数字的加减和乘除。

第三部分:总结与回顾数独作为一款益智游戏,对幼儿的全面发展提供了积极的影响。

通过训练逻辑思维和数学能力,数独不仅能够激发幼儿对数学的兴趣,还能够培养他们解决问题的能力和耐心。

在数独的指导下,幼儿可以逐步提升自己的思维水平,为未来的学习打下坚实的基础。

幼儿园数字游戏《数独》教案 幼儿园游戏

幼儿园教育是孩子人生中非常重要的一部分,数字游戏《数独》作为一种启发幼儿思维、培养逻辑能力的游戏,越来越受到教育者和家长的重视。

本文将从数独游戏的定义、游戏的意义、幼儿园数独游戏的实施方法以及游戏的教学目的等方面进行探讨。

一、数独游戏的定义1. 数独游戏是一种数字游戏,游戏盘面是一个9x9的方格,细分为9个3x3的小方格。

2. 游戏规则是将1-9的数字填入每一行、每一列以及每一个小方格中,使得每一行、每一列以及每一个小方格中的数字没有重复,且符合数独的解题规则。

二、数独游戏的意义1. 启发幼儿思维:数独游戏需要幼儿根据已有数字进行逻辑推理,填入合适的数字,培养幼儿的思维能力和逻辑能力。

2. 培养耐心和集中注意力:数独游戏需要幼儿花费一定的时间和精力来进行解题,培养幼儿的耐心和集中注意力的能力。

3. 提高数学素养:数独游戏不仅可以培养幼儿的逻辑思维能力,还可以提高幼儿的数学素养,让幼儿在游戏中学习数字。

三、幼儿园数独游戏的实施方法1. 游戏准备:准备一些适合幼儿使用的数独游戏盘,盘面数字不宜过于复杂,可以根据幼儿的芳龄和认知能力适当设计难度。

2. 游戏指导:老师可以先向幼儿讲解数独游戏的规则和要求,让幼儿对游戏有一个基本的了解。

3. 游戏实施:让幼儿分成小组或者独自进行数独游戏,老师可以对游戏过程进行引导和指导,帮助幼儿理解游戏规则和逻辑推理。

4. 游戏总结:在游戏结束后,老师可以对游戏过程进行总结,让幼儿共享他们在游戏中的体会和收获。

四、游戏的教学目的1. 培养幼儿的逻辑思维能力:数独游戏需要幼儿根据已有数字进行逻辑推理,并填入合适的数字,培养了幼儿的逻辑思维能力。

2. 提高幼儿的数学素养:数独游戏让幼儿在游戏中学习数字,培养了他们的数学素养。

3. 培养幼儿的耐心和集中注意力:数独游戏需要幼儿花费一定的时间和精力来进行解题,培养了他们的耐心和集中注意力的能力。

数独游戏作为一种启发幼儿思维、培养逻辑能力的游戏,在幼儿园教育中发挥了积极的作用。

数独游戏系统的设计与实现(JScript)(附答辩记录)

数独游戏系统的设计与实现(JScript)(附答辩记录)数独游戏系统的设计与实现(JScript)(附答辩记录)(包含选题审批表,任务书,开题报告,中期检查报告,毕业论文10000字,答辩记录,成绩评定册,程序代码) 摘要:数独游戏是十八世纪瑞士数学家欧拉提出的,近年来风靡全球的一种智力游戏。

越来越多的人喜欢玩数独游戏...<p>数独游戏系统的设计与实现(JScript)(附答辩记录)(包含选题审批表,任务书,开题报告,中期检查报告,毕业论文字,答辩记录,成绩评定册,程序代码)<br />摘要:数独游戏是十八世纪瑞士数学家欧拉提出的,近年来风靡全球的一种智力游戏。

越来越多的人喜欢玩数独游戏,本文对数独游戏进行了一些基本的介绍,通过本文可以了解到数独游戏的起源及其一些发展过程。

在本文中对数独游戏的基本解法进行了讲解,对一些难度较大的解法也有提及,给出了数独游戏初期的生成思路和部分设计中出现的代码。

该程序主要使用JS编程语言。

<br />关键字:JScript;数独;题目生成;模块设计<br /><br />Design and Realiztion of Sudoku Game System<br />Abstract: The problem of Sudoku is invented Swiss mathematician who named Euler and it becomes more and more popular in the whole globe.More and more people like to play sudoku. In this paper,introduced some basic of Sudoku game, through this can understand the origins of Sudoku and some of the development process. In this article on sudoku game to explain certain basic solution, the solution of some difficult also mentioned that, given the early Sudoku generate design ideas and some of the code appears. The program mainly uses JS programming language. <span class='Yjd577'></span> <br />Key words:Jscript;Sudoku;Subject generated;Module design<br /><br />数独游戏的规则和通用解法<br />数独游戏不需要特定的语言基础,也不需要进行数字运算,这也是该游戏能够在全世界流行的原因。

数独游戏的设计与开发毕业设计

摘要本文介绍了利用C++语言编写数独游戏的方法。

游戏的开发设计使用了vs2010作为开发工具,根据数独游戏特有的规则特点对游戏进行设计。

并且游戏在开发的过程中使用了微软的MFC开源框架,在数独游戏的界面上做了一定的处理。

本文首先对游戏进行了简单的介绍,对游戏的计算机实现进行分析。

最后通过部分游戏截图和数据表格来介绍了游戏的开发设计过程和游戏的基本操作。

并根据软件工程的方法,从需求分析、概要设计、详细设计、编码实现等方面阐述了游戏的开发流程,并通过游戏界面的截图、数据表格等体现了我的设计思路。

关键字:数独 C++ MFC 毕业设计T AbstractThis paper describes the use of C + + method number written language alone game. Game development and design using vs2010 as a development tool, according to the Sudoku rules specific to the characteristics of the game design. And the game uses Microsoft's MFC source framework development process, in Sudoku interface to do some processing. This paper first gives a brief introduction to the game, the game's computer-implemented analysis. Finally, some games screenshots and data tables to introduce the basic operation of the game development and game design process. And in accordance with the method of software engineering, from requirements analysis, aspects of the outline design, detailed design, coding realization expounded the game development process, and through screenshots game interface, data tables, etc. embodies my design ideas.Keywords: Sudoku C++ MFC graduation目录1 引言 (1)1.1 简介 (1)1.2 数独的起源 (1)1.3 数独的发展 (1)2 开发环境及开发工具 (2)2.1 C++语言简介 (2)2.2 MFC语言简介 (2)3.系统的需求分析 (2)3.1现行系统概况描述...............................................,23.2需求分析 (2)4.系统开发可行性分析 (2)5.系统分析 (2)6.系统设计 (3)6.1设计思路 (3)6.2系统主要类设计 (3)6.2.1 GamePad类 (3)6.2.2 SudokuDlg类 (4)6.2.3 Sudokugame类 (5)7.系统主要技术特色 (11)8.结论 (11)9.参考文献 (12)10.致谢 (12)1.引言1.1简介数独游戏是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构大型作业实验报告书 设计题目:“数独”游戏设计与求解

一.题目说明 数独的游戏规则: 1、在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩 家需要自己按照逻辑推敲出剩下的空格里是什么数字。 2、必须满足的条件:每一行与每一列都有1到9的数字,每个小 九宫格里也有1到9的数字,并且一个数字在每行、每列及每 个小九宫格里只能出现一次,既不能重复也不能少。 3、每个数独游戏都可根据给定的数字为线索,推算解答出来。

按照数独的游戏规则,用计算机实现已知数独的求解和数独题目的出题。

二.数据结构说明 数据结构一维数组、二维数组以及类似于“栈”的数据结构。 主要操作有:进栈,出栈,栈顶元素的操作等等

三.抽象数据类型(Abstract Data Type 简称ADT) 五个全局变量数组,其中两个二维数组,三个一维数组。 int a[10][10] 接受输入数据,空白处则初始化为0。之所以把数组范围设计为10*10,是为了程序的可读性。符合人的习惯思维。

int sd[82] 在实现“回溯”算法的时候,因为要用到栈的数据结构,所以把a[10][10]二维数组中的数据转换储存进sd[82]一维数组。方便处理题目以及保存最后结果。

int fix[82] 对应于sd[82],记录哪些位置已经确定。确定则fix值为1,未确定为0。

int possible[82][10] 第一维对应着sd[82]中的每一个,第二维的下标为每个位置的可能值。有可能则为第二维的下标,不可能则为-1。 int stack[82] 类似于“栈”数据结构的数组,实现“回溯”算法的关键所在。回溯之前,把所有fix值为0的数据存如stack数组中,即进栈。回溯中逐渐确定这些位置的数值,无法确定者(即1--9都不适合的)则应回退到前一位置,修改其fix值,以此类推。直至stack中所有的值都确定下来(即题目完成),或者回退到了最初点的前一位置(说明题目有误)。

四.算法设计 程序可以考虑人工智能的算法。所谓人工智能的算法,应当是算法设计者对该游戏的特性有较为深入的了解,依据其内在联系设计出的和人类思维相似的解决算法。但这似乎太过复杂,所以这里决定采用“回溯”的方法解决数独问题。 基本框架如下:

五.数独程序代码: #include"stdio.h" //标准输入输出头文件 #include"conio.h" //包含getch()的头文件

从界面读取数据到

将a[10][10]中

数据转存入sd[82]

预处理,算出所有fix和possible值

“回溯法

"计算数独 #include"stdlib.h" //包含rand()的头文件 #include"assert.h" //包含assert()的头文件 #include"time.h" //包含srand()的头文件

//五个全局变量数组 int a[10][10];//用来接收输入数据的数组 int sd[82];//处理题目以及保存最终结果 int fix[82];//记录哪些位置是确定的,确定为1,否则为0 int possible[82][10];//记录所有未确定数字的可能性 int stack[82];//用来放置填入的数的栈

void clssd()//初始化函数,所有位置设为0 { int i,j,k; for(i=0;i<9;i++) for(j=0;j<9;j++) a[i][j]=0; for(k=1;k<=81;k++) sd[k]=0; }

int line(int line,int value)//检验行 { int i; for(i=1;i<=9;i++) { if(a[line][i]==value) return 0; } return 1; }

int row(int row,int value)//检验列 { int i; for(i=1;i<=9;i++) { if(a[i][row]==value) return 0; } return 1; }

int square(int line,int row,int value)//检验3*3的九宫 { int L,R,i,j; L=(line%3!=0)+line/3;//L表示所在九宫的行数 R=(row%3!=0)+row/3;//R表示所在九宫的列数 for(i=(L-1)*3+1;i<=L*3;i++) { for(j=(R-1)*3+1;j<=R*3;j++) if(a[i][j]==value) return 0; } return 1; }

//四个转换函数 int transform_to_line(int i)//实现sd[i]->a[line][row]之间的转换 { int line; line=i/9+(i%9!=0); return line; }

int transform_to_row(int i)//实现sd[i]->a[line][row]之间的转换 { int row; row=i%9+9*(i%9==0); return row;

} void transform_to_a(int i)//sd[i]->a[line][row]的转换 {

int l,r; l=transform_to_line(i); r=transform_to_row(i); a[l][r]=sd[i];

}

void transform_to_sd()//实现a[line][row]->sd[i]的转换 { int line,row,i=1;

for(line=1;line<=9;line++) for(row=1;row<=9;row++) do {

sd[i]=a[line][row]; i++;

break; }while(i<=81);

}

//输出函数 void printAll() { int i; for(i=0;i<81;i++) { if(i%9==0) printf("\n\n\t\t"); printf("%4d",sd[i+1]);

} printf("\n\n\n"); }

void input()//输入数据到a[10][10] { system("cls");//清屏 int b[3]={0,0,0},i,j; printf("请输入已知数据"); printf("\n\n例如输入7 8 9,表示第8行 第9列的数值为7,以此类推。\n\n\n"); do {

printf("\n输入数据:按照 值 / 行 / 列的顺序,以0结束"); for(i=0;i<3;i++) { j=getch()-48; if(j==0&&i==0) break;//实现按0结束语句 if(j>0&&j<10) { b[i]=j; printf("%3d",b[i]); } else i--; } a[b[1]][b[2]]=b[0];

}while(j); transform_to_sd(); printf("\n\n\n\t您输入的题目为:\n\n");//打印输入的数独 printAll();

}

//三个重要函数 bool beExist(int i,int j)//判断 sd 数组中位置为 i 的元素是否存在 { int l,r; l=transform_to_line(i); r=transform_to_row(i); //if(sd[i]!=0) return 1; 关键的错误所在!!!

if(line(l,j)*row(r,j)*square(l,r,j)==0) return 1; else return 0; }

void setPb()//控制possible数组 { int i,j; for(i=1;i<=81;i++) {

for(j=1;j<=9;j++) { if(sd[i]!=0) possible[i][j]=-1; //如果sd[i]为已知输入数据,则将可能值设为-1 else if( beExist(i,j)) {possible[i][j]=-1;}//若在行、列、九宫内,存在相同数值则possible设为-1 else {possible[i][j]=j;}//其他情况讲可能值保存进possible数组 } }

}

bool fixAll(int sd[],int fix[],int possible[82][10])//控制fix数组 { int i,j; int k[82];

for(i=1;i<=81;i++)//将已经存在的数据对应fix数组中的值设为1,不存在设为0 { if(sd[i]!=0) {fix[i]=1;} else {fix[i]=0;} }

for(i=1;i<=81;i++)//判断未确定空格处值的可能性 { if(sd[i]!=0) continue; if(fix[i]==0) { for(j=1;j<=9;j++) if(possible[i][j]!=-1) k[i]++; } if(k[i]==1)//如果存在只有一种可能的位置则将fix[i]改为1 fix[i]=1; sd[i]=possible[i][j]; }

相关文档
最新文档