数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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