数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河

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

八皇后问题

1.问题描述

设在初始状态下在国际象棋的棋盘上没有任何棋子(这里的棋子指皇后棋子)。然后顺序在第1行,第2行……第8行上布放棋子。在每一行中共有8个可选择的位置,但在任一时刻棋盘的合法布局都必须满足3个限制条件(1)任意两个棋子不得放在同一行(2)任意两个棋子不得放在同一列上(3)任意棋子不得放在同一正斜线和反斜线上。

2.基本要求

编写求解并输出此问题的一个合法布局的程序。

3、实现提示:

在第i行布放棋子时,从第1列到第8列逐列考察。当在第i行第j列布放棋子时,需要考察布放棋子后在行方向、列方向、正斜线和反斜线方向上的布局状态是否合法,若该棋子布放合法,再递归求解在第i+1行布放棋子;若该棋子布放不合法,移去这个棋子,恢复布放该棋子前的状态,然后再试探在第i行第j+1列布放棋子。

4 程序代码

#include

#include

static char Queen[8][8];

static int a[8];

static int b[15];

static int c[15];

static int QueenNum=0;//记录总的棋盘状态数

void qu(int i);//参数i代表行

{

int Line,Column;

//棋盘初始化,空格为*,放置皇后的地方为@

for(Line=0;Line<8;Line++)

{

a[Line]=0; //列标记初始化,表示无列冲突

for(Column=0;Column<8;Column++)

Queen[Line][Column]='*';

}

//主、从对角线标记初始化,表示没有冲突

for(Line=0;Line<15;Line++)

b[Line]=c[Line]=0;

qu(0);

return 0;

}

void qu(int i)

{

int Column;

for(Column=0;Column<8;Column++)

{

if(a[Column]==0&&b[i-Column+7]==0&&c[i+Column]==0) //如果无冲突

{

Queen[i][Column]='Q'; //放皇后

a[Column]=1;//标记,下一次该列上不能放皇后

b[i-Column+7]=1;//标记,下一次该主对角线上不能放皇后

c[i+Column]=1;//标记,下一次该从对角线上不能放皇后

if(i<7) qu(i+1); //如果行还没有遍历完,进入下一行

else//否则输出

//输出棋盘状态

int Line,Column;

cout<<"第"<<++QueenNum<<"种状态为:"<

for(Line=0;Line<8;Line++)

{

for(Column=0;Column<8;Column++)

cout<

cout<

}

cout<

getchar();

}

/*如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置*/

Queen[i][Column]='*';

a[Column]=0;

b[i-Column+7]=0;

c[i+Column]=0;

}

}

}

5 程序结果

题目2 背包问题的求解

1.问题描述

假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,…w n的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+w m=T,要求找出所有满足上述条件的解。

例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:

(1,4,3,2)

(1,4,5)

(8,2)

(3,5,2)。

2.实现提示

可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后,顺序选取物品装入背包,若已选取第i件物品后未满,则继续选取第i+1件,若该件物品“太大”不能装入,则弃之,继续选取下一件,直至背包装满为止。

如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入的物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直到求得满足条件的解,或者无解。

由于回溯求解的规则是“后进先出”,自然要用到“栈”。

进一步考虑:如果每件物品都有体积和价值,背包又有大小限制,求解背包中存放物品总价值最大的问题解---最优解或近似最优解。

3.题目源代码

#define maxsize 1024

#define null 0

#include"stdio.h"

#include"conio.h"

#include"stdio.h"

typedef struct{

int last;

int data[maxsize];

}seqlist; //定义顺序表结构体

typedef struct{

int top;

int sum;

int data[maxsize];

}seqstack; //定义栈结构体

seqstack *init_seqstack(){

seqstack *s;

s=new seqstack;

if(!s)

{

printf("空间不足");

return null;

}

else

相关文档
最新文档