算法分析与设计实验报告实验2:回溯法的应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(int i=0;i<n-1;i++) {
printf("%d,",queen[i]); } printf("%d)\n",queen[n-1]); }
void func(int n,int row) //参数 row 表示当前从第 row 行开始摆放,n 表示 一共有 n 个皇后 {
if(n==row) //摆放完 n 个皇后,输出结果 {
位选手都有一个起步的分数为 10 分。某获胜选手最终得分刚好是 100 分,如
果不让你看比赛过程,你能推断出 Ta 的答题情况吗?
例如:
输入:100
输出:
1011010000
0111010000
0010110011
输入:92
No Answer
1.
调
试
过
程
及
实
验
2.
结
果
回溯法是有组织的进行穷举,在试探过程中不断通过题设要求减少搜索空间,
return 0; }
func(sum-n,n+1,score); } void fn(int sum,int n,int score) {
func(sum,n,score); if(tag==0) {
printf("No Answer\n"); } } int main() { int n; printf("请输入某选手的分数:"); scanf("%d",&n); fn(10,1,n);
tag=1; for(int i=1;i<=10;i++) {
printf("%d",result[i]); } printf("\n"); return; } else if(n>=11||sum<=0) { return; } result[n]=1; func(sum*2,n+1,score); result[n]=0;
1.2(递归) #include<stdio.h>
int queen[50]={0}; //初始化皇后摆放的位置
int count=0;
//存放摆法的种类
/* 判断第 row 行皇后是否符合要求 */
int judge(int row)
{
int i;
for(i=0;i<row;i++)
{
/* 判断与前 i 个已经摆放的元素是否处于同一列和同一斜线 */
print(n); count++; return; } for(int col=1;col<=n;col++) //从第一列开始遍历到最后一列 { queen[row]=col; /*如果符合摆放条件,进入递归,摆放下一行*/ if(judge(row)==1) {
func(n,row+1); } /*不符合条件,则进行下一次循环,重新寻找摆放位置*/ } } int main() {
if(queen[i]==queen[row]||queen[i]-queen[row]==i-row||queen[i]-q ueen[row]==row-i)
{ return 0;
} } return 1; } /* print 函数输出摆放结果 */ void print(int n) { printf("(");
境
(1)n 皇后问题
2018/4/2
在一个 n×n 格的棋盘上放置 n 个皇后,使得它们彼此不受攻击。按照国际象
棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任
实
验
何棋子。因此,n 皇后问题等价于要求在一个 n×n 格的棋盘上放置 n 个皇后,
内
使的任何 2 个皇后不能被放在同一行或同一列或同一斜线上。编写算法求出所
容
有的可能的摆放方法。要求用递归和非递归两种方法完成。
例如:
输入:4
输出:(2,4,1,3)、(3,1,4,2)
(2)奇怪的比赛
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回
答 10 个问题(其编号为 1 到 10),越后面越有难度。答对的,当前分数翻倍;
答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每
课程实验报告
课程名称 算法分析与设计 班级 计算 161 实验日期
姓名
何严鸿
学号 20160701 实验成绩 9
实验名称
实验 2:回溯法的应用
实
ຫໍສະໝຸດ Baidu1.理解状态空间树的剪枝搜索策略;
验
目
2.掌握用回溯法解题的算法框架;
的
3.掌握回溯法的基本思想。
及
要
求
实
操作系统:Windows
验
环
IDE:Visual C++
}
} int main() {
int n,que[50]; for(int i=0;i<50;i++) {
que[i]=-1; } printf("请输入皇后的个数:"); scanf("%d",&n); queen(que,n); printf("结果数:%d\n",count);
return 0; }
int n; printf("请输入一共有几个皇后:"); scanf("%d",&n); func(n,0); printf("结果数:%d\n",count); return 0; } 2.#include<stdio.h> int result[11]={0}; int tag=0; void func(int sum,int n,int score) { if(sum==score&&n==11) {
总
而这种减少不是一个一个解的减少,而是对搜索空间进行大规模剪枝,从而使
结
得实际搜索空间远远小于问题的解空间。
1.1(非递归) #include<stdio.h>
附
录
int count=0;
int judge(int que[],int k)
{
int i;
for(i=0;i<k;i++)
{
if(que[i]==que[k]
||
que[i]-que[k]==i-k
||
que[i]-que[k]==k-i)
{
return 0;
}
}
return 1;
}
void output(int que[],int n)
{
printf("( ");
for(int i=0;i<n;i++)
{
printf("%d ",que[i]+1);
} printf(")\n"); } void queen(int que[],int n) { int k=0; while(k>=0) {
que[k]++; while(que[k]<n && judge(que,k)==0) {
que[k]++; } if(que[k]<n && k==n-1)
{ output(que,n); count++;
} if(que[k]<n && k<n-1) {
k++; } else {
que[k]=-1; k--; }