实验6 子集和问题的回溯算法设计与实现(报告)

合集下载

回溯分析报告

回溯分析报告

回溯分析报告1. 概述回溯分析是一种常用的问题解决方法,在许多领域都有广泛的应用。

回溯分析是一种深度优先搜索的算法,通过尝试所有可能的解决方案来寻找问题的最优解。

在本文档中,我们将详细介绍回溯分析的原理和应用,以及如何使用回溯分析来解决问题。

2. 回溯分析原理回溯分析的基本原理是尝试所有可能的解决方案,并通过逐步迭代的方式来找到最优解。

回溯分析通常包括以下几个步骤:1.定义问题的解空间:确定问题的解空间,即问题的可能解决方案的集合。

2.筛选可行解:根据问题的约束条件筛选出满足条件的可行解。

3.遍历解空间:遍历解空间中的所有可能解,通常使用递归的方式来实现。

4.判断解的有效性:判断每个可能解是否满足问题的要求,如果不满足,则回溯到上一步继续尝试其他解。

5.找到最优解:通过不断地回溯和尝试,找到问题的最优解。

3. 回溯分析的应用回溯分析在许多领域都有广泛的应用,下面分别介绍了几个常见的应用场景:3.1 组合优化问题回溯分析可以用于解决组合优化问题,如旅行商问题(TSP)、背包问题等。

通过尝试所有可能的组合方式,找到最优解决方案。

3.2 图的遍历和搜索回溯分析可以用于图的遍历和搜索问题,如深度优先搜索(DFS)、广度优先搜索(BFS)等。

通过逐步地向前搜索,找到满足条件的解。

3.3 棋盘类问题回溯分析可以用于解决各种棋盘类问题,如八皇后问题、数独等。

通过逐步地摆放棋子或填写数字,找到满足条件的解。

3.4 解数独问题示例下面以解数独问题为例,介绍回溯分析的具体应用:def solve_sudoku(board):if not find_empty_location(board):return Truerow, col = find_empty_location(board)for num in range(1, 10):if is_safe(board, row, col, num):board[row][col] = numif solve_sudoku(board):return Trueboard[row][col] =0return False上面的代码通过递归的方式遍历数独中的每个空格,尝试填入数字,并判断是否满足数独的规则。

回朔法实验报告

回朔法实验报告

一、实验目的1. 理解回溯法的基本原理和适用场景。

2. 掌握回溯法在解决实际问题中的应用。

3. 通过实验,提高编程能力和算法设计能力。

二、实验背景回溯法是一种在计算机科学中广泛应用的算法设计方法。

它通过尝试所有可能的解,在满足约束条件的前提下,逐步排除不满足条件的解,从而找到问题的最优解。

回溯法适用于解决组合优化问题,如0-1背包问题、迷宫问题、图的着色问题等。

三、实验内容本次实验以0-1背包问题为例,采用回溯法进行求解。

1. 实验环境:Windows操作系统,Python 3.7以上版本。

2. 实验工具:Python编程语言。

3. 实验步骤:(1)定义背包容量和物品重量、价值列表。

(2)定义回溯法函数,用于遍历所有可能的解。

(3)在回溯法函数中,判断当前解是否满足背包容量约束。

(4)若满足约束,则计算当前解的价值,并更新最大价值。

(5)若不满足约束,则回溯至前一步,尝试下一个解。

(6)输出最优解及其价值。

四、实验结果与分析1. 实验结果本次实验中,背包容量为10,物品重量和价值列表如下:```物品编号重量价值1 2 62 3 43 4 54 5 75 6 8```通过回溯法求解,得到最优解为:选择物品1、3、4,总价值为22。

2. 实验分析(1)回溯法能够有效地解决0-1背包问题,通过遍历所有可能的解,找到最优解。

(2)实验结果表明,回溯法在解决组合优化问题时具有较高的效率。

(3)在实验过程中,需要合理设计回溯法函数,以提高算法的效率。

五、实验总结通过本次实验,我们了解了回溯法的基本原理和适用场景,掌握了回溯法在解决实际问题中的应用。

在实验过程中,我们提高了编程能力和算法设计能力,为今后解决类似问题奠定了基础。

在今后的学习和工作中,我们将继续深入研究回溯法及其应用,以期为解决实际问题提供更多思路和方法。

算法分析与设计实验报告--回溯法

算法分析与设计实验报告--回溯法

算法分析与设计实验报告--回溯法实验目的:通过本次实验,掌握回溯法的基本原理和应用,能够设计出回溯法算法解决实际问题。

实验内容:1.回溯法概述回溯法全称“试探回溯法”,又称“逐步退化法”。

它是一种通过不断试图寻找问题的解,直到找到解或者穷尽所有可能的解空间技术。

回溯法的基本思路是从问题的某一个初始状态开始,搜索可行解步骤,一旦发现不满足求解条件的解就回溯到上一步,重新进行搜索,直到找到解或者所有可能的解空间已经搜索完毕。

2.回溯法的基本应用回溯法可用于求解许多 NP 问题,如 0/1 背包问题、八皇后问题、旅行商问题等。

它通常分为两种类型:一种是通过枚举所有可能的解空间来寻找解;另一种则是通过剪枝操作将搜索空间减少到若干种情况,大大减少了搜索时间。

3.回溯法的解题思路(1)问题分析:首先需要对问题进行分析,确定可行解空间和搜索策略;(2)状态表示:将问题的每一种状况表示成一个状态;(3)搜索策略:确定解空间的搜索顺序;(4)搜索过程:通过逐步试探,不断扩大搜索范围,更新当前状态;(5)终止条件:在搜索过程中,如果找到了满足要求的解,或者所有的可行解空间都已搜索完毕,就结束搜索。

4.八皇后问题八皇后问题是指在一个 8x8 的棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列或同一对角线上。

通过回溯法可以求解出所有的可能解。

实验过程:回溯法的实现关键在于搜索空间的剪枝,避免搜索无用的解;因此,对于八皇后问题,需要建立一个二维数组来存放棋盘状态,以及一个一维数组来存放每行放置的皇后位置。

从第一行开始搜索,按照列的顺序依次判断当前的空位是否可以放置皇后,如果可以,则在相应的位置标记皇后,并递归到下一行;如果不能,则回溯到上一行,重新搜索。

当搜索到第八行时,获取一组解并返回。

代码实现:```pythondef is_valid(board, row, col):for i in range(row):if board[i] == col or abs(board[i] - col) == abs(i - row):return Falsereturn True实验结果:当 n=4 时,求得的所有可行解如下:```[[1, 3, 0, 2],[2, 0, 3, 1]]```本次实验通过实现回溯法求解八皇后问题,掌握了回溯法的基本原理和应用,并对回溯法的核心思想进行了深入理解。

实验6 子集和问题的回溯算法设计与实现(报告)

实验6   子集和问题的回溯算法设计与实现(报告)

实验6 子集和问题的回溯算法设计与实现一、实验目的1、掌握回溯法解题的基本思想;2、掌握回溯算法的设计方法;3、针对子集和数问题,熟练掌握回溯递归算法、迭代算法的设计与实现。

二、实验内容1、认真阅读教材或参考书, 掌握回溯法解题的基本思想, 算法的抽象控制策略;2、了解子集和数问题及解向量的定长和变长状态空间表示;3、针对解向量的定长表示, 设计状态空间树节点扩展的规范(限界)函数及实现方法;4、分析深度优先扩展状态空间树节点或回溯的条件;5、分析和设计生成解向量各分量可选值的实现方法;6、设计和编制回溯算法的递归和迭代程序。

【实验题】:组合数问题:找出从自然数1,2,…,n中任取r个数的所有组合。

三、算法的原理方法回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。

当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。

如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。

在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。

扩大当前候选解的规模,以继续试探的过程称为向前试探。

可以采用回溯法找问题的解,将找到的组合以从小到大顺序存于a[0],a[1],…,a[r-1]中,组合的元素满足以下性质:(1)a[i+1]>a[i],后一个数字比前一个大;(2)a[i]-i<=n-r+1。

按回溯法的思想,找解过程可以叙述如下:首先放弃组合数个数为r的条件,候选组合从只有一个数字1开始。

因该候选解满足除问题规模之外的全部条件,扩大其规模,并使其满足上述条件(1),候选组合改为1,2。

继续这一过程,得到候选组合1,2,3。

该候选解满足包括问题规模在内的全部条件,因而是一个解。

在该解的基础上,选下一个候选解,因a[2]上的3调整为4,以及以后调整为5都满足问题的全部要求,得到解1,2,4和1,2,5。

算法设计与分析---回溯实验报告

算法设计与分析---回溯实验报告

《算法设计与分析》实验报告实验三回溯法3.迷宫问题一天Luna在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,. 和#,前者表示可以通行后者表示不能通行。

同时当Luna处在某个格点时,她只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Luna想要从点A走到点B(不能走出迷宫)。

如果起点或者终点有一个不能通行(为#),则看成无法办到。

[输入]第1行是测试数据的组数k,后面跟着k组输入。

每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n 的。

接下来是一个n * n的矩阵,矩阵中的元素为. 或者#。

再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb 行, 第lb列。

注意到ha, la, hb, lb全部是从0开始计数的。

1.八皇后问题1.1解题思路八皇后问题的解法,很简单的解法。

通过回溯实现枚举。

对于当前行,尝试是否可在当前列放置皇后,然后进入下一行的尝试,同时尝试完毕以后,要将当前行回复(回溯),来进行下一次尝试。

到达最后一行的时候,即递归结束条件,打印结果即可。

1.2程序运行情况1.3所有的皇后解见附录。

(毕竟92个解...)1.4程序源码(含注释)2. 24点问题2.1 解题思路这题虽然使用dfs很简单,但是有一点思维在里面。

我很惭愧,自己没有想出来怎么如意的独立AC此题。

遇到的最大的问题——如何插入括号?枚举插入、和运算符一同排列都不靠谱。

解决方法是:用同等的办法转化。

每一次从待组合的是数字中,任取两个数,随机用运算符计算完毕后,再放回去。

下一次计算,再次重复这个过程,可以等价为有括号的运算方式了。

遇到第二个问题——如何实现这种“任取两个数”的选择方式。

这里就直接体现出了我个人能力的不足。

居然没想到。

尝试使用STL的set,但是没成功。

回溯法__算法实验报告

回溯法__算法实验报告
number[i]=x;
itoa(x,buffer,10); //itoa():将一个10进制的integer数转换为string类型
//即:把输入的int型操作数x,转变成可以放在buffer[]中的string类型
expression[i]=buffer; //用expression[i]指针指向buffer[]数组空间的起始位置
实验报告
(2014/2015学年第二学期)
课程名称
算法分析与设计
实验名称
回溯法
实验时间
2015

5

28

指导单位
计算机学院软件工程系
指导教师
张怡婷
学生姓名
王珣
班级学号
B13040212
学院(系)
计算机学院、软件学院
专业
计算机科学与技术
实验报告
实验名称
回溯法
指导教师
张怡婷
实验类型
验证
实验学时
2
实验时间
result.numerator=this->numerator*b.denominator+this->denominator*b.numerator;
result.Simplify();
return result;
}
RationalNumber operator-(const RationalNumber& b) const{
double x,y;
x=denominator*1.0/b.denominator;
y=numerator*1.0/b.numerator;
if(x==y)
return true;

回溯法算法设计范文

回溯法算法设计范文

回溯法算法设计范文回溯法,也称为试探法,是一种在问题求解过程中通过尝试不同的可能解,并逐步回退到之前的状态,再继续尝试其他可能解的方法。

这种方法通常适用于具有多种可能解,而且问题的解空间较大的情况。

回溯法的基本思想是从问题的一个初始解开始,通过试探的方式找到问题的解。

在试探的过程中,如果发现当前的解不能满足问题的要求,就会回溯到之前的状态,然后继续试探其他的可能解,直到找到满足问题要求的解,或者发现没有更多的可能解。

回溯法的算法设计一般包括三个要素:问题的状态定义、约束条件定义和解的选择方式。

问题的状态定义:回溯法通常将问题的解表示为一个状态,该状态可以用一个数据结构来表示,例如数组、字符串、图等。

在问题求解过程中,每次试探的解都是对这个状态的更新,直到找到可行的解或者无法继续试探为止。

约束条件定义:问题通常有一些约束条件,这些约束条件规定了试探的解必须满足的条件。

在回溯法中,每次试探的解都必须满足这些约束条件,否则将回溯到之前的状态。

解的选择方式:在回溯法中,每次试探的解都是根据一定的规则来选择的。

根据问题的特点和求解的要求,可以选择不同的策略来进行解的选择,例如先选择靠前位置的解、先选择靠后位置的解、选择满足特定条件的解等。

这种解的选择方式将影响问题的求解效率和解的质量。

回溯法的算法过程通常可以描述为递归的过程。

每次进行试探的解时,会对当前的状态进行更新,并根据约束条件判断当前的解是否可行。

如果当前的解满足约束条件,则继续递归地进行下一步的试探;如果当前的解不满足约束条件,则立即回溯到之前的状态,尝试其他的解。

在回溯的过程中,可能会出现多个分支,对每个分支都进行试探,直到找到满足问题要求的解。

回溯法的时间复杂度通常较高,因为需要尝试所有可能的解。

因此,在设计回溯法算法时,需要注意问题的解空间大小和约束条件的复杂度,以及选择合适的解的选择方式,来降低算法的时间复杂度。

总结而言,回溯法是一种通过尝试不同的可能解,并逐步回退到之前的状态,再继续尝试其他可能解的方法。

回溯算法实验报告(一)

回溯算法实验报告(一)

回溯算法实验报告(一)回溯算法实验报告1. 简介回溯算法是一种经典的解决问题的方法,特别适用于求解排列组合问题、迷宫问题以及图的搜索等。

本实验旨在探究回溯算法的原理、应用以及优缺点。

2. 原理回溯算法是一种递归的算法,通过不断试错来找出问题的解。

其基本思想是: - 从问题给定的初始解开始,逐步构建一个候选解; - 当候选解不满足约束条件时,进行回溯,返回上一步重新构建候选解;- 当所有候选解都被尝试过且都不满足约束条件时,算法停止。

3. 应用回溯算法在很多领域都有广泛的应用,以下列举几个常见的例子:1. 排列组合问题:如求解一个数组的全排列; 2. 迷宫问题:如求解从起点到终点的路径; 3. 图的搜索:如深度优先搜索(DFS)和广度优先搜索(BFS)。

4. 优缺点回溯算法有以下优点: - 适用性广:可以解决多种问题,特别擅长于求解排列组合和搜索类问题; - 简单直观:算法思想直观,易于理解和实现。

但回溯算法也有一些缺点: - 效率较低:因为回溯算法需要枚举所有可能的解,所以在问题规模较大时,时间复杂度较高; - 可能存在重复计算:如果问题的解空间中存在重复的子问题,回溯算法可能会进行重复的计算。

5. 实验结论通过本实验我们可以得出以下结论: 1. 回溯算法是一种经典的解决问题的方法,可应用于多个领域; 2. 回溯算法的基本原理是试错法,通过逐步构建候选解并根据约束条件进行回溯,找到问题的解;3. 回溯算法的优点是适用性广、简单直观,但缺点是效率较低且可能存在重复计算。

因此,在实际应用中,我们需要根据具体问题的特点来选择适合的算法。

回溯算法在问题规模较小时可以快速得到解答,但对于规模较大的问题,可能需要考虑其他高效的算法。

6. 探索进一步改进回溯算法的方法虽然回溯算法在解决一些问题时非常有用,但对于问题规模较大的情况,它可能会变得低效且耗时。

因此,我们可以探索一些方法来改进回溯算法的性能。

6.1 剪枝策略在回溯算法中,我们可以通过剪枝策略来减少无效的搜索路径,从而提高算法的效率。

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

实验6 子集和问题的回溯算法设计与实现一、实验目的1、掌握回溯法解题的基本思想;2、掌握回溯算法的设计方法;3、针对子集和数问题,熟练掌握回溯递归算法、迭代算法的设计与实现。

二、实验内容1、认真阅读教材或参考书, 掌握回溯法解题的基本思想, 算法的抽象控制策略;2、了解子集和数问题及解向量的定长和变长状态空间表示;3、针对解向量的定长表示, 设计状态空间树节点扩展的规范(限界)函数及实现方法;4、分析深度优先扩展状态空间树节点或回溯的条件;5、分析和设计生成解向量各分量可选值的实现方法;6、设计和编制回溯算法的递归和迭代程序。

【实验题】:组合数问题:找出从自然数1,2,…,n中任取r个数的所有组合。

三、算法的原理方法回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。

当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。

如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。

在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。

扩大当前候选解的规模,以继续试探的过程称为向前试探。

可以采用回溯法找问题的解,将找到的组合以从小到大顺序存于a[0],a[1],…,a[r-1]中,组合的元素满足以下性质:(1)a[i+1]>a[i],后一个数字比前一个大;(2)a[i]-i<=n-r+1。

按回溯法的思想,找解过程可以叙述如下:首先放弃组合数个数为r的条件,候选组合从只有一个数字1开始。

因该候选解满足除问题规模之外的全部条件,扩大其规模,并使其满足上述条件(1),候选组合改为1,2。

继续这一过程,得到候选组合1,2,3。

该候选解满足包括问题规模在内的全部条件,因而是一个解。

在该解的基础上,选下一个候选解,因a[2]上的3调整为4,以及以后调整为5都满足问题的全部要求,得到解1,2,4和1,2,5。

由于对5不能再作调整,就要从a[2]回溯到a[1],这时,a[1]=2,可以调整为3,并向前试探,得到解1,3,4。

重复上述向前试探和向后回溯,直至要从a[0]再回溯时,说明已经找完问题的全部解。

四、实验程序的功能模块void comb(int n,int r); //计算排列函数,传入参数数组规模大小n,排列的规模大小r,输出排列结果。

五、详细代码#include <stdio.h>#include <iostream>#define N 100using namespace std;int a[N]; //暂存结果数组,排列void comb(int n,int r){ int i,j; i=0; a[i]=1;do {if(a[i]-i<=n-r+1)/*还可以向前试探*/{if (i==r-1)/*已找到一个组合*/{for (j=0;j<r;j++)cout<<a[j];cout<<endl;a[i]++;continue;}i++;a[i] = a[i-1] + 1; /*向前试探*/}else{if (i==0)return;/*已找到所有解*/a[--i]++;} /*回溯*/}while (1);}int main(){int n,r;cin>>n>>r;comb(n,r);return 0;}六、测试数据和相应的实验结果Input:3 21 2 3Output:1 21 32 3七、思考题1、在3×3个方格的方阵中要填入数字1到N(N≥10)内的某9个数字,每个方格填一个整数,似的所有相邻两个方格内的两个整数之和为质数。

试求出所有满足这个要求的各种数字填法。

答:# include <stdio.h># define N 12void write(int a[ ]){ int i,j;for (i=0;i<3;i++){for (j=0;j<3;j++)printf("%3d",a[3*i+j]);printf("\n");}scanf("%*c");}int b[N+1];int a[10];int isprime(int m){int i;int primes[]={2,3,5,7,11,17,19,23,29,-1};if (m==1||m%2==0)return 0;for (i=0;primes[i]>0;i++)if (m==primes[i]) return 1;for (i=3;i*i<=m;){ if (m%i==0)return 0;i+=2;}return 1;}int checmatrix[ ][3]={ {-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}}; int selectnum(int start){ int j;for (j=start;j<=N;j++)if (b[j])return j;return 0;}int check(int pos){ int i,j;if (pos<0)return 0;for (i=0;(j=checmatrix[pos][i])>=0;i++)if (!isprime(a[pos]+a[j]))return 0;return 1;}int extend(int pos){ a[++pos]=selectnum(1);b[a[pos]]=0;return pos;}int change(int pos){ int j;while (pos>=0&&(j=selectnum(a[pos]+1))==0)b[a[pos--]]=1;if(pos<0)return -1;b[a[pos]]=1;a[pos]=j;b[j]=0;return pos;}void find(){ int ok=0,pos=0;a[pos]=1;b[a[pos]]=0;do{if (ok)if (pos==8){write(a);pos=change(pos);}else pos=extend(pos);else pos=change(pos);ok=check(pos);}while (pos>=0);}void main(){ int i;for (i=1;i<=N;i++)b[i]=1;find();}(1)4,9,8 1,2,3 6,11,16 (2)1,2,54,3,87,10,9(3)2,1,45,6,78,11,122、试针对0/1背包问题设计回溯算法,比较与子集和数问题的算法差异。

答:0/1背包问题是子集树,是满二叉树,而子集和数问题是排列树。

就以本实验的题目来说,两者解空间构成的树如下:0/1背包问题解空间树:a[i]表示第i件物品,边0表示不放入背包,边1表示放入背包子集和数问题解空间树:a[i]表示第i个数,从根节点到叶节点表示一个排列3、求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局。

思考题可选做一个。

答:一个合适的解应是在每列、每行上只有一个皇后,且一条斜线上也只有一个皇后。

求解过程从空配置开始。

在第1列至第m列为合理配置的基础上,再配置第m+1列,直至第n 列配置也是合理时,就找到了一个解。

接着改变第n列配置,希望获得下一个解。

另外,在任一列上,可能有n种配置。

开始时配置在第1行,以后改变时,顺次选择第2行、第3行、…、直到第n行。

当第n行配置也找不到一个合理的配置时,就要回溯,去改变前一列的配置。

为使程序在检查皇后配置的合理性方面简易方便,引入以下三个工作数组:(1)数组a[ ],a[k]表示第k行上还没有皇后;(2)数组b[ ],b[k]表示第k列右高左低斜线上没有皇后;(3)数组c[ ],c[k]表示第k列左高右低斜线上没有皇后;棋盘中同一右高左低斜线上的方格,他们的行号与列号之和相同;同一左高右低斜线上的方格,他们的行号与列号之差均相同。

初始时,所有行和斜线上均没有皇后,从第1列的第1行配置第一个皇后开始,在第m列col[m]行放置了一个合理的皇后后,准备考察第m+1列时,在数组a[ ]、b[ ]和c[ ]中为第m列,col[m]行的位置设定有皇后标志;当从第m列回溯到第m-1列,并准备调整第m-1列的皇后配置时,清除在数组a[ ]、b[ ]和c[ ]中设置的关于第m-1列,col[m-1]行有皇后的标志。

一个皇后在m列,col[m]行方格内配置是合理的,由数组a[ ]、b[ ]和c[ ]对应位置的值都为1来确定。

得到求解皇后问题的算法如下:# include <stdio.h># include <stdlib.h># define MAXN 20int n,m,good;int col[MAXN+1],a[MAXN+1],b[2*MAXN+1],c[2*MAXN+1];void main(){ int j;char awn;printf("Enter n: "); scanf("%d",&n);for (j=0;j<=n;j++) a[j]=1;for (j=0;j<=2*n;j++) b[j]=c[j]=1;m=1; col[1]=1; good=1; col[0]=0;do {if (good)if (m==n){ printf("列\t行");for (j=1;j<=n;j++)printf("%3d\t%d\n",j,col[j]);printf("Enter a character (Q/q for exit)!\n");scanf("%c",&awn);if (awn=='Q'||awn=='q') exit(0);while (col[m]==n){ m--;a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=1;}col[m]++;}else{ a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=0;col[++m]=1;}else{ while (col[m]==n) { m--;a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=1;}col[m]++;}good=a[col[m]]&&b[m+col[m]]&&c[n+m-col[m]];} while (m!=0);}。

相关文档
最新文档