当前位置:文档之家› 回溯法解决8皇后问题实验报告

回溯法解决8皇后问题实验报告

回溯法解决8皇后问题实验报告
回溯法解决8皇后问题实验报告

算法设计与分析

实验报告

实验名称:用回溯法解决八皇后问题姓名:

学号:

江苏科技大学

一、实验名称:回溯法求解8皇后问题

二、学习知识:

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解的空间树。算法搜索至解的空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。

三、问题描述

(1)使用回溯法解决八皇后问题。

8皇后问题:在8*8格的棋盘上放置彼此不受攻击的8个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。8后问题等价于在8*8格的棋盘上放置8个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。

(2)用高级程序设计语言实现

四、求解思路

Procedure PLACE(k)

//如果一个皇后能放在第k行和X(k)列,则返回true,否则返回false。X是一个全程数组,进入此过程时已置入了k个值。ABS(r)过程返回r的绝对值//

global X(1:k); integer i,k;

i←1

while i

if X(i)=X(k) or ABS(X(i)-X(k))=ABS(i-k) then

return (false)

end if

i←i+1

repeat

return (true)

End PLACE

Procedure NQUEENS(n)

//此过程使用回溯法求出一个n*n棋盘上放置n个皇后,使其不能互相攻击的所有可能位置//

integer k,n,X(1:n)

X(1)←0 ; k←1 // k是当前行;X(k)是当前列 //

while k>0 do // 对所有的行,执行以下语句 //

X(k)←X(k)+1 //移到下一列//

while X(k)<=n and Not PLACE(k) do //此处能放这个皇后吗//

X(k)←X(k)+1 //不能放则转到下一列//

repeat

if X(k)<=n then //找到一个位置//

if k=n then print (X) //是一个完整的解则打印这个数组// else k←k+1;X(k)←0 //否则转到下一行//

end if

else k←k-1 //回溯//

end if

repeat

End NQUEENS

五、算法实现

本实验程序是使用C#编写,算法实现如下:

1.queen类—实现8皇后问题的计算,将结果存入数组。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

namespace _8Queen

{

public class Queen

{

public static ArrayList arr = new ArrayList(); //存放查询结果

private static bool[] columflag = new bool[8]{true,

true,true,true,true,true,true,true};//列占用标记 true为可用

private static bool[] leftflag = new bool[15]{true,true,true,

true,true,true,true,true,true,true,true,true,true,true,true};//左行对角线占用标记private static bool[] rightflag = new bool[15]{true,true,

true,true,true,true,true,true,true,true,true,true,true,true,true};//右行对角线占用标记private static int[,] position = new

int[,]{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0, 0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}};//皇后位置坐标

public static int sum = 0;

public static void TryStep(int i)//i取值1至8

{

for (int j = 1; j <= 8; j++)

{

if (columflag[j - 1] && leftflag[i + j - 2] && rightflag[i - j + 7])//如果当前位置可以放置

{

columflag[j - 1] = false;

leftflag[i + j - 2] = false;

rightflag[i - j + 7] = false;//占用

position[i - 1, j - 1] = 1;//加入皇后位置

if (i < 8)

TryStep(i + 1);//进入下一行

else

{

int[,] position1 = new int[8,8];//皇后位置坐标à

for (int m = 0; m < 8; m++) //打印解法

{

for (int n = 0; n < 8; n++)

position1[m, n] = position[m, n];

}

arr.Add(position1);

int t = arr.Count;

sum++;//解法数统计

}

columflag[j - 1] = true;//如果不能放置时,取消占座及移走皇后

leftflag[i + j - 2] = true;

rightflag[i - j + 7] = true;

position[i - 1, j - 1] = 0;

}

}

}

}

}

2.图形界面Form1

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/ef5276300.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace _8Queen

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

run();

}

private PictureBox[,] card;

private int rows;//行数

private int cols;//列数

private int size = 8;

public int index = 0;

public int sum;

private void run()//初始化动态加载8*8的PictureBox控件,作为棋盘

{

rows = size;

cols = size;

this.card = new PictureBox[rows, cols];

this.panel1.Controls.Clear();

for (int i = 0; i < rows; i++)

{

for (int j = 0; j < cols; j++)

{

this.card[i, j] = new PictureBox();

this.card[i, j].Location = new System.Drawing.Point(70 * j, 70 * i);

this.card[i, j].Name = i.ToString() + j.ToString();

this.card[i, j].Size = new System.Drawing.Size(70, 70);

this.panel1.Controls.Add(card[i, j]);

}

}

Queen.TryStep(1);

sum = Queen.arr.Count;

for (int f = 1; f <= sum; f++)

{

https://www.doczj.com/doc/ef5276300.html,boBox1.Items.Add(f);

}

comboBox1.SelectedIndex = 0;

label3.Text = sum.ToString();

setPictureBox();

}

public void setPictureBox()//布局,放置皇后

{

int[,] p = (int[,])Queen.arr[index];

for (int i = 0; i < rows; i++)

{

for (int j = 0; j < cols; j++)

{

if (((i % 2) != (j % 2)))

{

if (p[i, j] == 0)

this.card[i, j].Image = Image.FromFile("..\\..\\picture\\背景

\\3.jpg");

else

this.card[i, j].Image = Image.FromFile("..\\..\\picture\\背景

\\1.jpg");

}

else

{

if (p[i, j] == 0)

this.card[i, j].Image = Image.FromFile("..\\..\\picture\\背景

\\4.jpg");

else

this.card[i, j].Image = Image.FromFile("..\\..\\picture\\背景

\\2.jpg");

}

}

}

}

private void next_Click(object sender, EventArgs e)//点击“下一个”按钮

{

index++;

if (index+1 > sum)

{

index = 0;

MessageBox.Show("结束!共"+sum+"种方案?");

}

setPictureBox();

comboBox1.Text = (index + 1).ToString();

comboBox1.SelectedIndex = index;

}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)//选择某一个方案

{

index = comboBox1.SelectedIndex;

setPictureBox();

}

}

}

六、运行结果任意截取四种方案

共92种方案 可以任选一种方案显示

七、实验小结: 回溯法有“通用解题法”之称。用它可以系统地搜索一个问题的所有解或任一解。回溯法在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。它适合于解组合数较大的问题

程序下载地址:https://www.doczj.com/doc/ef5276300.html,/detail/orchid_0606/8347899

八年级下册物理实验报告单(供参考)

年级:八年级姓名:日期:3月6日 实验名称:用弹簧测力计测量力的大小 一、实验目的 1.练习使用弹簧测力计。 2.正确使用弹簧测力计测量力的大小。 二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计2个(规格相同),钩码2个,铁架台。 三、实验步骤或内容: 1.检查实验器材。 2.测量手的拉力。 3.测量钩码所受的重力。 4.测两个弹簧测力计相互作用的拉力。 5.整理器材。 五、实验记录与结论 1.弹簧测力计的量程 0-5N ,分度值 0.2N ,指针是否指零刻线是。 2.记录数据:

年级:八年级姓名:日期: 实验名称:探究重力的大小与质量的关系。 一、实验目的 探究重力的大小与质量的关系。 二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计,铁架台,相同的钩码5个(质量已知),铅笔, 刻度尺。 三、实验步骤或内容:要求步骤或内容简单明了 (1)检查器材:观察弹簧测力计的量程、分度值,指针是否指到 零刻度线。 (2)将弹簧测力计悬挂在支架上。 (3)将钩码逐个加挂在弹簧测力计上。 (4)将5次的测量结果记录在表格中。 (5)整理器材。 四、实验记录与结论 1.观察弹簧测力计的量程为 0-5N N,分度值为 0.2 N。 实验结论: 重力的大小跟物体的质量的关系是物体所受重力与物体质量成 正比。

年级:八年级姓名:日期: 实验名称:探究影响滑动摩擦力大小的因素 一、实验目的 探究压力的大小和接触面的粗糙程度对滑动摩擦力大小的影响。 二、实验仪器和器材(要求标明各仪器的规格型号) 木块,砝码,弹簧测力计,毛巾。 三、实验步骤或内容:要求步骤或内容简单明了 (1)检查器材:观察弹簧测力计的量程和分度值,指针是否指在零刻线处。(2)当木块在水平桌面上运动,测出压力F=G木块时木块受到的滑动摩擦力。(3)改变压力,将砝码放在木块上,测出木块压力F>G木块时木块受到的滑动摩擦力。 (4)改变接触面的粗糙程度,将毛巾平铺在水平桌面上,测出压力F=G木块时木块受到的滑动摩擦力。 (5)整理器材。 五、实验记录与结论 (1)弹簧测力计的量程为0-5N,分度值为0.2N。 (3)实验结论: 在接触面相同时,压力越大,滑动摩擦力越大;在压力相等的情况下,接触表面越粗糙,滑动摩擦力越大。

算法实验 递归回溯解八皇后问题

深圳大学实验报告 课程名称:算法分析与复杂性理论 实验项目名称:八皇后问题 学院:计算机与软件学院 专业:软件工程 指导教师:杨烜 报告人:学号:班级:15级软工学术型实验时间:2015-12-08 实验报告提交时间:2015-12-09 教务部制

一.实验目的 1.掌握选回溯法设计思想。 2.掌握八皇后问题的回溯法解法。 二.实验步骤与结果 实验总体思路: 根据实验要求,通过switch选择八皇后求解模块以及测试数据模块操作,其中八皇后模块调用摆放皇后函数模块,摆放皇后模块中调用判断模块。测试数据模块主要调用判断模块进行判断,完成测试。用一维数组保存每行摆放皇后的位置,根据回溯法的思想递归讨论该行的列位置上能否放置皇后,由判断函数Judge()判断,若不能放置则检查该行下一个位置。相应结果和过程如下所示(代码和结果如下图所示)。 回溯法的实现及实验结果: 1、判断函数 代码1: procedure BTrack_Queen(n) //如果一个皇后能放在第K行和X(k)列,则返回true,否则返回false。 global X(1:k);integer i,k i←1 while i0 do X(k)←X(k)+1 //移到下一个位置 while X(k)<=n and not Judge(k) do //判断能否放置皇后 X(k)←X(k)+1 repeat if X(k)<=n //找到一个位置 then if k=n //是一个完整的解吗

八年级(下)物理实验报告单

一练习使用弹簧测力计 班级姓名 实验目的:会正确使用弹簧测力计 实验器材:弹簧测力计一个,其余学生自备。 1.观察:弹簧测力计的量程是,分度值是。 2.检查:指针是否指在零刻度线上?指针是否与平板之间有摩擦? 3.感受: 用手拉测力计,使指针分别指在1N、3N、5N,感受一下1N、3N、5N的力的大小。 4.测量: (1)把笔袋挂在挂钩上,提起笔袋,笔袋对测力计的拉力,F= (2)把笔袋挂在挂钩上,在桌面上水平拖动笔袋,笔袋对测力计的拉力,F= (3)拉断一根头发,所需要的力,F= 5.使用弹簧测力计时: (1)如果所测量的力的大小超出测力计的量程,会 (2)如果没有认清分度值,会 (3)如果指针指在零刻度线的上方或下方就进行测量,会使测量值或

二探究重力的大小跟质量的关系 班级姓名 实验目的:正确使用弹簧测力计,正确记录实验数据,正确绘制数据图像,根据实验数据和图像总结出重力的大小跟质量的关系 实验器材:弹簧测力计一个,勾码一盒。 1.看勾码盒上的标注,每个勾码的质量是kg。 2.逐次增挂钩码个数,测出所受重力,并记录在下面的表格中。 3.在右图中,以质量为横坐标,重力为纵坐标, 描点并画出重力与质量的关系图像。 4.分析数据和图像,重力与质量的关系是 重力与质量的比值是(用g表示)。重力与质量的关系式用字母表示为: 5. 重力与质量的比值g=9.8N/kg,表示的物理意义是

三探究二力平衡的条件 班级姓名 实验目的:通过探究,知道作用在一个物体上的两个力满足什么条件时,才能平衡。 实验器材:长木板(两端有滑轮)一个,小车一个(两端有挂钩),钩码一盒,细绳两段。 1.小车保持平衡状态,是指小车处于状态或状态。 2.按右图所示装好器材 3. 两端挂上数量不相等的钩码,观察小车的运动状态。 4. 两端挂上数量相等的钩码,观察小车的运动状态。 5. 两端挂上数量相等的钩码,把小车在水平桌面上扭转一个角度后再放手,观察小车的运动状态。 把实验条件和观察到现象记录在下面的表格中 6.总结二力平衡的条件: 作用在同一个物体上的两个力,如果大小,方向,并且 ,这两个力就彼此平衡。这时物体就处于状态或状态。

回溯法之N皇后问题(C语言)

//回溯法之N皇后问题当N>10,就有点抽了~~ /*结果前total行每行均为一种放法,表示第i行摆放皇后的列位置,第total+1行,输出total*/ #include #include int n,stack[100]; //存当前路径 int total; //路径数 void make(int l) //递归搜索以stack[l]为初结点的所有路径 { int i,j; //子结点个数 if (l==n+1) { total=total+1; //路径数+1 for(i=1;i<=n;i++) printf("%-3d",stack[i]); //输出第i行皇后的列位置stack[i] printf("\n"); exit; //回溯(若试题仅要求一条路径,则exit改为halt即可)} for (i=1;i<=n;i++) { stack[l]=i; //算符i作用于生成stack[l-1]产生子状态stack[l]; if (!att(l,i)) make(l+1); } //再无算符可用,回溯 } int att(int l,int i) { int k; for (k=1;k

n后问题实验报告

一.实验目的 1. 了解皇后相互攻击的条件:如果任意两个皇后在同一行,同一列或同一对角线,则她们相互攻击。 2. 运用迭代的方法实现n皇后问题,求解得到皇后不相互攻击的一个解 二.实验内容 基本思路:用n元组x[1:n]表示n后问题的解,其中x[i]表示第i个皇后放在棋盘的第i行的第x[i]列。抽象约束条件得到能放置一个皇后的约束条件:(1)x[i]!=x[k]; (2)abs(x[i]-x[k])!=abs(i-k)。应用回溯法,当可以放置皇后时就继续到下一行,不行的话就返回到第一行,重新检验要放的列数,如此反复,直到将所有解解出。在回溯法中,递归函数Backtrack(1)实现对整个解空间的回溯搜索。Backtrack(i)搜索解空间的第i层子树。类Queen的数据成员记录解空间的节点信息,以减少传给Backtrack函数的参数。sum记录当前已找到的可行方案数。 运用回溯法解题通常包含以下三个步骤: (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。 源代码: #include using namespace std; class Queen{ friend int nQueen(int); private: bool Place(int k); void Backtract(int t); int n,*x; long sum; //可行方案数 }; bool Queen::Place(int k) { for(int j=1;j

数据结构实验报告利用栈结构实现八皇后问题

数据结构实验报告 实验名称:实验二——利用栈结构实现八皇后问题 学生姓名: 班级: 班内序号: 学号: 日期:2013年11月21日 1.实验要求 (1)实验目的 通过选择下面五个题目之一进行实现,掌握如下内容: 进一步掌握指针、模板类、异常处理的使用 掌握栈的操作的实现方法 掌握队列的操作的实现方法 学习使用栈解决实际问题的能力 学习使用队列解决实际问题的能力 (2)实验内容 利用栈结构实现八皇后问题。 八皇后问题19世纪著名的数学家高斯于1850年提出的。他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。请设计算法打印所有可能的摆放方法。 ①可以使用递归或非递归两种方法实现 ②实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线。 (3)代码要求 ①必须要有异常处理,比如删除空链表时需要抛出异常; ②保持良好的编程的风格: 代码段与段之间要有空行和缩近 标识符名称应该与其代表的意义一致 函数名之前应该添加注释说明该函数的功能 关键代码应说明其功能 ③递归程序注意调用的过程,防止栈溢出 2. 程序分析 2.1 存储结构 栈(递归):

2.2 关键算法分析 (1)递归 void SeqStack::PlaceQueen(int row) //在栈顶放置符合条件的值的操作,即摆放皇后{ for (int col=0;col::Judgement() { for(int i=0;i

n皇后问题算法实验报告

算法分析与设计实验报告 实验内容:N皇后问题 实验时间:2013.12.3 姓名:杜茂鹏 班级:计科1101 学号:0909101605

一、实验内容及要求 在n×n格的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 二、实验目的 1.巩固和加深对回溯法的理解 2.了解递归和迭代法在回溯法中的应用 三、算法分析 1.理解皇后不被攻击的条件:n后问题等价于在n*n格的棋盘上放置n个皇后,任何两个皇后不能放在同一行或同一列或同一斜线上。 2.算法模块简要分析 用数组存储皇后的位置,将i设置为0. Int place(*x,n) :数组x[] 用来表示列数,n为皇后个数,用来判断皇后是否被攻击,判断的条件是(x[i]-x[n]==i-n||x[i]-x[n]==n-i||x[i]==x[n])即用来判断“同一行或同一列或同一斜线上”。 Int print(*x,n):打印皇后解的空间。 Int iniprint(*x,n):初始化打印函数,相当于对棋盘初始化。将可以放皇后的位置记为“1”,不放皇后的位置记为“0”。 Int Nqueen(int n):n皇后问题求解,如果满足一组可行解,sum++。Int i=0,如果x[i]>=n的时候即进行下一行,i++;当i=n时,

sum++;输出该组可行解的个数和位置的矩阵。并且i--,回溯到上一层继续搜索可行解。 四、运行结果及分析 1、三皇后没有可行解 2、 2.4个皇后有2个可行解 3.5皇后有10个可行解 五、源代码 #include static int n, sum=0;//可行解个数 static int locate[20]; int place(int k) {//判断是否在一条线上并返回0,1 for(int i=1;in){

八皇后问题及解答

八皇后问题 问题描述: 在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相冲突 (在每一横列,竖列,斜列只有一个皇后)。 求解: 标题: 八皇后问题的解(回溯法程序代码) 发信站: 网易虚拟社区(Fri Jul 14 10:06:52 2000),站内信件 以前上学的时候,写8皇后程序的时候偷懒用最笨的算法,在8086上计算十皇后的时候,我放了张纸条,说明计算机正在运行,然后去吃饭,吃完以后,才看到结果。前几天,刚好有空,所以重写了一次,以补当年的遗憾。 #include "stdio.h" int attacked(int *array,int position){ int flag=-1; float step; if(position==1) return flag; for(step= 1.00;step

(array+(int)step)-*(array+position))/(step-position))==-1){ flag=1; break;}} return flag;}void main(void){ int countSum,queenSum,printCount,*queenArray,queenPosition=0; int tempArray[20]={66,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; countSum=1; queenArray=tempArray; printf("input you queenSum here: "); scanf("%d",&queenSum); fflush(stdin); if(queenSum<4){ printf("the %d queen's sum is 0\n",queenSum); return;}for(;;){ if(countSum=queenSum){ if(*(queenArray+countSum-1)

数据结构实验报告——栈(八皇后问题)

1.实验要求 【实验目的】 1、进一步掌握指针、模板类、异常处理的使用 2、掌握栈的操作的实现方法 3、掌握队列的操作的实现方法 4、学习使用栈解决实际问题的能力 5、学习使用队列解决实际问题的能力 【实验内容】 利用栈结构实现八皇后问题。 八皇后问题19世纪著名的数学家高斯于1850年提出的。他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。请设计算法打印所有可能的摆放方法。 提示: 1、可以使用递归或非递归两种方法实现 2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析 2.1 存储结构 存储结构:栈(递归) 2.2 关键算法分析 【设计思想】 由于八皇后问题,可以分解成算法相同的子问题,所以使用递归的方法 【伪代码】 1、输入皇后个数n 2、k=1 3、判断k是否大于n 3.1 是:打印一组可能 3.2 否:循环行位置1~n 判断该位置是否符合要求,若符合记录q[k]的坐标y值 k+1 重复3 【关键算法】 1、递归 void Queen::Queens(int k,int n)

{ int i; if(k>n) { Print(n); count(); } else { for(i=1;i<=n;i++) if(Isavailable(i,k)) //判断该行中该位置放置‘皇后’是否符合要求 { q[k]=i; //记录改行中该点的位置 Queens(k+1,n); //放置下一行的‘皇后’ } } } 2、判断皇后放置位置是否符合要求 bool Queen::Isavailable(int i,int k) { int j; j=1; while(j

回溯算法与八皇后问题N皇后问题Word版

回溯算法与八皇后问题(N皇后问题) 1 问题描述 八皇后问题是数据结构与算法这一门课中经典的一个问题。下面再来看一下这个问题的描述。八皇后问题说的是在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突。更通用的描述就是有没有可能在一张N*N的棋盘上安全地放N个皇后? 2 回溯算法 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解。回溯算法就是解决这种问题的“通用算法”,有“万能算法”之称。N皇后问题在N增大时就是这样一个解空间很大的问题,所以比较适合用这种方法求解。这也是N皇后问题的传统解法,很经典。 下面是算法的高级伪码描述,这里用一个N*N的矩阵来存储棋盘: 1) 算法开始, 清空棋盘,当前行设为第一行,当前列设为第一列 2) 在当前行,当前列的位置上判断是否满足条件(即保证经过这一点的行,列与斜线上都没 有两个皇后),若不满足,跳到第4步 3) 在当前位置上满足条件的情形: 在当前位置放一个皇后,若当前行是最后一行,记录一个解; 若当前行不是最后一行,当前行设为下一行, 当前列设为当前行的第一个待测位置;

若当前行是最后一行,当前列不是最后一列,当前列设为下一列; 若当前行是最后一行,当前列是最后一列,回溯,即清空当前行及以下各行的棋盘,然后,当前行设为上一行,当前列设为当前行的下一个待测位置; 以上返回到第2步 4) 在当前位置上不满足条件的情形: 若当前列不是最后一列,当前列设为下一列,返回到第2步; 若当前列是最后一列了,回溯,即,若当前行已经是第一行了,算法退出,否则,清空当前行及以下各行的棋盘,然后,当前行设为上一行,当前列设为当前行的下一个待测位置,返回到第2步; 算法的基本原理是上面这个样子,但不同的是用的数据结构不同,检查某个位置是否满足条件的方法也不同。为了提高效率,有各种优化策略,如多线程,多分配内存表示棋盘等。 为了便于将上述算法编程实现,将它用另一种形式重写: Queen() Loop: if check_pos(curr_row, curr_col) == 1 then put_a_queen(curr_row, curr_col); if curr_row == N then record_a_solution(); end if; if curr_row != N then curr_row = curr_row + 1; curr_col = 1; else if curr_col != N then curr_col = curr_col + 1; else backtrack(); end if; end if; else if curr_col != N then

八年级下册物理实验报告单(供参考)

初中物理实验报告单 年级:八年级姓名:日期:3月6日 实验名称:用弹簧测力计测量力的大小 一、实验目的 1.练习使用弹簧测力计。 2.正确使用弹簧测力计测量力的大小。 二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计2个(规格相同),钩码2个,铁架台。 三、实验步骤或内容: 1.检查实验器材。 2.测量手的拉力。 3.测量钩码所受的重力。 4.测两个弹簧测力计相互作用的拉力。 5.整理器材。 五、实验记录与结论 1.弹簧测力计的量程 0-5N ,分度值 0.2N ,指针是否指零刻线是。 2.记录数据: 初中物理实验报告单 年级:八年级姓名:日期: 实验名称:探究重力的大小与质量的关系。 一、实验目的 探究重力的大小与质量的关系。

二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计,铁架台,相同的钩码5个(质量已知),铅笔, 刻度尺。 三、实验步骤或内容:要求步骤或内容简单明了 (1)检查器材:观察弹簧测力计的量程、分度值,指针是否指到 零刻度线。 (2)将弹簧测力计悬挂在支架上。 (3)将钩码逐个加挂在弹簧测力计上。 (4)将5次的测量结果记录在表格中。 (5)整理器材。 四、实验记录与结论 1.观察弹簧测力计的量程为 0-5N N,分度值为 0.2 实验结论: 重力的大小跟物体的质量的关系是物体所受重力与物体质量成 正比。 初中物理实验报告单 年级:八年级姓名:日期: 实验名称:探究影响滑动摩擦力大小的因素 一、实验目的 探究压力的大小和接触面的粗糙程度对滑动摩擦力大小的影响。 二、实验仪器和器材(要求标明各仪器的规格型号) 木块,砝码,弹簧测力计,毛巾。

n皇后问题实验报告

N后问题算法 一、实验目的及要求 所要涉及或掌握的知识: 1. 了解皇后相互攻击的条件:如果任意两个皇后在同一行,同一列或同一对角线,则她们相互攻击。 2. 运用迭代的方法实现6皇后问题,求解得到皇后不相互攻击的一个解 3. 在运用迭代的方法实现编程时,要注意回溯点 二、问题描述及实验内容 对6皇后问题求解,用数组c[1…6]来存皇后的位置。c[i]=j表示第i个皇后放在第j列。 最后程序运行的结果是c[1…6]={1,5,8,6,3,7 } 三、问题分析和算法描述 6-QUEENS的算法表示: 输入:空。 输出:对应于6皇后问题的解的向量c[1…6]={1,5,8,6,3,7} 1. for k=1 to 6 2. c[k]=0 //没有放皇后 3. end for 4. flag=false 5. k=1 6. while k>=1 7.while c[k]<=5 8.c[k]=c[k]+1

9.if c为合法着色 then set flag=ture 且从两个while循环退出 10.else if c是部分解 then k=k+1 11.end while 12. c[k]=0 //回溯并c[k]=0 13. k=k-1 14. end while 15. if flag then output c 16. else output “no solution” 四、具体实现 # include #include #include #include #include "iostream" using namespace std; int total = 0; //方案计数 void backtrace(int queen[],int N) { int i, j, k; cout<<"★为皇后放置位置\n"; for (i=1;;) { //首先安放第1行 if(queen[i]

回溯法解八皇后问题

回溯法解八皇后问题 在N * N 格的棋盘上放置彼此不受攻击的N 个皇后。N个皇后问题等价于在N * N 格的棋盘上放置N 个皇后,任何2个皇后不在同一行或同一列或同一斜线上。当N等于8,就是著名的八皇后问题。 此问题是通过C语言程序编写的,在Turboc环境下完成实现的。输出结果见(输出结果。TXT文件) 详细代码为: /*///////////////////////////////////////////////////////////////////// /// /////The programming is a complex problem about the ways of queens./////// /////Programmer: Luo Xiaochun /////// /////Completed date: 2007.12 //////// /////V ersion number: Turboc 2.0 //////// /////////////////////////////////////////////////////////////////////// /*/ #include #include #define false 0 #define true 1 #define quesize 8 int gx[quesize+1]; int sum=0; int place( int k ); void print( int a[] ); void nqueens( int n ); FILE *fp; int main( ) { system("cls"); fp = fopen("outfile.txt", "w");

八皇后实验报告

实验项目: 八皇后问题 1.实验目的: 通过求解皇后问题,熟悉深度优先搜索法DFS(回溯法(Backtracking Algorithms)技术。 2.实验内容: 由n2 个方块排成n行n列的正方形称为n元棋盘。如果两个皇后位于n元棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。现要找出使棋盘上n个皇后互不攻击的布局。编制程序解决上述问题,以n=6运行程序,输出结果。 3.程序简介: 将n个皇后放到一个n*n的方阵中,要求每个皇后不在同一行同一列及同一对角线,我的程序是先把每个皇后放在了第零列,然后再按行检查,不符合要求继续下一列,若已经到这一行的最后一列,还没找到符合要求的位置,则回到上一行。 4.算法设计介绍: 定义一个一维数组,数组的下标是皇后所在位置的行数,数组存的值是皇后所在位置的列数,现将A[0]-A[n-1]都赋成零,然后随着检查的进行,皇后的位置也在不断地变化,最后找到一个符合要求的方阵时,本质上就是一个存放整数的一维数组,数组的下标是行数,存放的值是列数。 5.困难及解答 我很久以前就听说过八皇后问题,没想到现在轮到自己编了,一开始还真是特别糊涂呢,后来老师上课把算法大概讲了一遍,就清楚很多了,要说问题,就是一开始纠结怎么存放皇后,我开始想用二维数组着,后来老师说用一

维数组比较好做,我看了一下老师的算法,就明白了大概,经过一段时间就编出来了 5.心得 我编程变得还是很少,天天下决心说以后多编,也没践行,心想着吧,不挂在嘴上了,努力! 6.程序清单 /* //我真诚地保证: //我独立完成了整个程序从分析、设计到编码的所有工作。 //如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中 //详细地列举我所遇到的问题,以及别人给我的提示。 //我的程序里中凡是引用到其他程序或文档之处, //例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段, //我都已经在程序的注释里很清楚地注明了引用的出处。 //我从未没抄袭过别人的程序,也没有盗用别人的程序,//不管是修改式的抄袭还是原封不动的抄袭。//我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转 文件名称: 创建者: 创建时间: 2011.4.14

八皇后问题(回溯法)

八皇后问题(回溯法)2009-08-11 12:03问题描述: 求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局,这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线4个方向互相捕捉。 解题思路: 总体思想为回溯法。 求解过程从空配置开始。在第1列~的m列为合理配置的基础上,再配置第m+1列,直至第n列也是合理时,就找到了一个解。在每列上,顺次从第一行到第n行配置,当第n行也找不到一个合理的配置时,就要回溯,去改变前一列的配置。 为使在检查皇后配置的合理性方面简易方便,引入一下4个工作数组: ?数组col[i],表示在棋盘第i列,col[i]行有一个皇后; ?数组a[],a[k]表示第k行上还没有皇后; ?数组b[],b[k]表示第k列右高左低斜线上没有皇后; ?数组c[],c[k]表示第k列左高右低斜线上没有皇后; 代码: #include #include void queen(int N) { //初始化N+1个元素,第一个元素不使用int col[N+1]; //col[m]=n表示第m列,第n行放置皇后 int a[N+1]; //a[k]=1表示第k行没有皇后 int b[2*N+1]; //b[k]=1表示第k条主对角线上没有皇后 int c[2*N+1]; //c[k]=1表示第k条次对角线上没有皇后 int j,m=1,good=1;char awn; for(j=0;j<=N;j++) {a[j]=1;} for(j=0;j<=2*N;j++) {b[j]=c[j]=1;} col[1]=1;col[0]=0; do { if(good) { if(m==N) //已经找到一个解

回溯法 八皇后

回溯法(8皇后问题) 1.1算法原理 回溯算法实际是一个类似枚举的搜索尝试方法,其基本思想是在搜索尝试中找问题的解,采用了一种“走不通就掉头”的思想,作为其控制结构。 从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有符合条件的位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后的位置,直到找到符合条件的位置就可以了。回溯在迷宫搜索中使用很常见,就是这条路走不通,然后返回前一个路口,继续下一条路。回溯算法说白了就是穷举法。不过回溯算法使用剪枝函数,剪去一些不可能到达最终状态(即答案状态)的节点,从而减少状态空间树节点的生成。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。 用回溯法搜索解空间树时,通常采用两种策略来避免无效搜索,提高回溯法的搜索效率。其一是用约束函数在扩展结点处剪去不满足约束的子树;其二是用限界函数剪去不能得到最优 解的子树。 1.2算法适用性 它适用于解一些组合数较大的问题,有条件限制的枚举,即优化的枚举. 1.3算法描述 8皇后回溯算法 1.设Column[8]数组依次存储第一行到第八行的列位置,QUEEN_NUM=8,皇后个数 2.从第一行第一列开始放置,开始放置下一行的皇后(当且仅当前行的皇后位置正确时) 3.判断放置位置是否合理:Column[i]==Column[n],判断是否在同一列, abs(Column[i]-Column[n])==(n-i)),判断时候在斜线上。如果不在用一列,同一斜线上,则位置合理,进行下一行皇后放置,否则回溯 4.当最后一行皇后放置正确时,一种放置方法结束,进行下一种方法,查找。

第五组回溯算法(N皇后排列方法问题)

实训一 N皇后排列方法问题的回溯算法与实现 一、设计目的 1)掌握N皇后排列方法问题的回溯算法; 2)进一步掌握回溯算法的基本思想和算法设计方法; 二、设计内容 1.任务描述 1)算法简介 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再 走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 2)N皇后排列方法问题简介 在N*N格的棋盘上放置彼此不受攻击的N个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在N*N格的棋盘上放置N个皇后,任何2个皇后不放在同一行或同一列或同一斜线上. 3)设计任务简介 对于回溯类似的问题。首先,要能理解该问题运用到的回溯的概念;其次,根据回溯相关的基本思想,找出相应的数学公式;最后,进行程序的设计和编写。 利用回溯的基本思想和计算步骤,有助于我们解决生活中遇到的各种数学问题。 4)问题分析 由于这是一个平面上棋子布局处理问题,因此,我们可以将问题看成是一个二维数组问题。给八个皇后分别编号为1,2,…,8,其中第i个皇后放置在第i行上,并这就解决了不同皇后分别摆放在 不同列的问题,这样又可以把问题简化为一个一维数组的问题,假设用一维数组x[i]来存放皇后所放 置的列,对于第i个皇后,假设它存放在x[i]列上,则对应的x数组应满足如下的条件:[2] 1)因为一共只有8列,故x[i]的取值只能取1到8之间的数。 2)因为不同的皇后只能粗放在不同的列上,则对于任意的i和j,应满足如果i!=j,则x[i]!=x[j] 3)因为不同的皇后不能存放在同一对角线上,故连接两个皇后的直线的斜率应不能等于正负1,而 连接任意第i个皇后和第j个皇后(i与j不同)的直线的斜率的计算公式为:(x[i]-x[j])/(i-j), 即(x[i]-x[j])/(i-j)!=±1,即:|x[i]-x[j]|!=| i-j | N皇后排列方法问题的表示方案

回溯算法的一些例题

回溯算法 搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。如迷宫问题:进入迷宫后,先随意选择一个前进方向,一步步向前试探前进,如果碰到死胡同,说明前进方向已无路可走,这时,首先看其它方向是否还有路可走,如果有路可走,则沿该方向再向前试探;如果已无路可走,则返回一步,再看其它方向是否还有路可走;如果有路可走,则沿该方向再向前试探。按此原则不断搜索回溯再搜索,直到找到新的出路或从原路返回入口处无解为止。 递归回溯法算法框架[一] procedure Try(k:integer); begin for i:=1 to 算符种数 Do if 满足条件 then begin 保存结果 if 到目的地 then 输出解 else Try(k+1); 恢复:保存结果之前的状态{回溯一步} end; end; 递归回溯法算法框架[二] procedure Try(k:integer); begin if 到目的地 then 输出解 else for i:=1 to 算符种数 Do if 满足条件 then begin 保存结果 Try(k+1); end; end;

例 1:素数环:把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。【算法分析】非常明显,这是一道回溯的题目。从1 开始,每个空位有 20(19)种可能,只要填进去的数合法:与前面的数不相同;与左边相邻的数的和是一个素数。第 20个数还要判断和第1个数的和是否素数。 〖算法流程〗1、数据初始化; 2、递归填数: 判断第J种可能是否合法; A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个; B、如果不合法:选择下一种可能; 【参考程序】 program z74;框架[一] var a:array[0..20]of byte; b:array[0..20]of boolean; total:integer; function pd(x,y:byte):boolean; var k,i:byte; begin k:=2; i:=x+y; pd:=false; while (k<=trunc(sqrt(i)))and(i mod k<>0) do inc(k); if k>trunc(sqrt(i)) then pd:=true; end; procedure print; var j:byte; begin inc(total);write('<',total,'>:'); for j:=1 to 20 do write(a[j],' '); writeln; end; procedure try(t:byte); var i:byte; begin for i:=1 to 20 do if pd(a[t-1],i)and b[i] then begin a[t]:=i; b[i]:=false; if t=20 then begin if pd(a[20],a[1]) then print;end

2014-2015八年级(下)物理实验报告单

庆坪中学探究实验报告单 八年级物理(下) 一练习使用弹簧测力计 班级姓名 实验目的:会正确使用弹簧测力计 实验器材:弹簧测力计一个,其余学生自备。 1.观察:弹簧测力计的量程是5N ,分度值是0.2N 。 2.检查:指针是否指在零刻度线上?指针是否与平板之间有摩擦? 3.感受: 用手拉测力计,使指针分别指在1N、3N、5N,感受一下1N、3N、5N的力的大小。 4.测量: (1)把笔袋挂在挂钩上,提起笔袋,笔袋对测力计的拉力,F= 4N (2)把笔袋挂在挂钩上,在桌面上水平拖动笔袋,笔袋对测力计的拉力,F=1.5N (3)拉断一根头发,所需要的力,F= 5.使用弹簧测力计时: (1)如果所测量的力的大小超出测力计的量程,会损坏弹簧秤 (2)如果没有认清分度值,会出现读数错误 (3)如果指针指在零刻度线的上方或下方就进行测量,会使测量值偏大或偏小

庆坪中学探究实验报告单 八年级物理(下) 二探究重力的大小跟质量的关系 班级姓名 实验目的:正确使用弹簧测力计,正确记录实验数据,正确绘制数据图像,根据实验数据和图像总结出重力的大小跟质量的关系 实验器材:弹簧测力计一个,勾码一盒。 1.看勾码盒上的标注,每个勾码的质量是0.05 kg。 2.逐次增挂钩码个数,测出所受重力,并记录在下面的表格中。 实验次数一个钩 码两个钩 码 三个钩 码 四个钩 码 五个钩 码 六个 钩码 质量m/kg 0.05 0.10 0.15 0.20 0.25 0.30 重力G/N 0.49 0.98 1.47 1.98 2.45 2.94 重力与质量之比9.8 9.8 9.8 9.8 9.8 9.8 3.在右图中,以质量为横坐标,重力为纵坐标, 描点并画出重力与质量的关系图像。 4.分析数据和图像,重力与质量的关系是 成正比关系 重力与质量的比值是9.8 (用g表示)。 重力与质量的关系式用字母表示为:G =mg 5. 重力与质量的比值g=9.8N/kg,表示的物

相关主题
文本预览
相关文档 最新文档