约瑟夫环与八皇后问题--数据结构课程设计实验报告

目 录

一、 问题描述 .................................... 1

二、 问题分析 .................................... 2

三、 数据结构描述................................. 2

四、 算法设计 .................................... 2

五、 详细程序清单................................. 4

六、 程序运行结果................................ 11

七、 心得体会 ................................... 12

一、 问题描述

1. 约瑟夫问题描述

编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。

2. 八皇后问题描述

在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相

3、界面设计模块问题描述

设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要 简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。

二、 问题分析

在整个课程设计中,我主要负责的是约瑟夫问题中链表中的出列的操作算法的设计。用循环单链表表示编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始输入一个正整数作为报数的上限值turn,从第一个人开始按顺时针方向自1开始顺序报数(即从第一个结点开始指针向后移动),报到turn-1时(即指针指向turn-1个结点时)停止,他的下一位出列,将他的下一位密码作为新的turn值,从出列的人的的顺时针方向上的下一个开始重新从1报数,如此下去,直至链表中只剩一位(即一个结点)退出循环,并所有人的编号按出列顺序输出。在实现的过程中定义i表示报数的循环次数,因为每次循环都会有一个人出列且只剩一个人时结束循环,所以i

三、 数据结构描述

typedef struct LNode{

int data;

struct LNode *next;

}node,*linklist; //单链表解决约瑟夫问题时储存结点信息

在单循环链表中进行出列的操作,方便、快捷、易理解。链表中的结点及其指针域、数值域之间的联系与各种赋值与转换使得出列操作的思路变得清晰简单。

四、 算法设计

我负责的是约瑟夫问题中链表中的出列的操作算法。

1. 算法流程图

2. 具体算法设计

void chulie(linklist L,int number)

{

} int turn,i,j; linklist p,s; printf(

五、 详细程序清单

#include

#include

#include

//八皇后问题

int count;int m,n;

int a[8];

int c[15];

int d[8][8];

int check(int i,int j);

void putchess(int i);

void takeposition(int i, int j);

void leaveposition(int i, int j);

void show( void );

void Queenstart(void)

{

count = 0;

for(m=0;m

{

a[m]=0;

for(n=0;n

{ d[m][n]=0; }

}

for(m=0;m

{

b[m]=0;

c[m]=0;}

}

void putchess(int i)

{

int j;

if(i

{

for(j=1;j

{

if(1==check(i,j))

takeposition(i,j);

putchess(i+1);

leaveposition(i,j);

}

}

}

else if(8==i)

{

for(j=1;j

{

if(1==check(i,j))

{

takeposition(i,j);

show();

leaveposition(i,j);

}

}

}

}

int check(int i,int j)

{

if(0==a[j-1] && 0==b[i+j-2] && 0==c[i-j+7])

{

return 1;

}

else

{

return 0;

}

void takeposition(int i, int j)

{

a[j-1]=1;

b[i+j-2]=1;

c[i-j+7]=1;

d[i-1][j-1]=1;

}

void leaveposition(int i, int j)

{

a[j-1]=0;

b[i+j-2]=0;

c[i-j+7]=0;

d[i-1][j-1]=0;

}

void show( )

{

count++;

printf(

for(m=0;m

{

for(n=0;n

{

if(0==d[m][n])

printf(

else

printf(

}

printf(

}

}

//约瑟夫环问题

typedef struct LNode{

int data;

int code;

struct LNode *next;

}node,*linklist;

linklist creatstart(linklist L,int number)

{

int m,i;

linklist s,p;

s=L; for(i=1;i

p->data=i;

printf(

p->next=NULL;

s->next=p;

s=p;

}

s->next=L->next;

return s;

}

void chulie(linklist L,int number)

{

int turn,i,j;

} printf(

void lianbiao()

{

int number;

}

/*---------------------------- 主菜单 ----------------------------*/ void menu(){

linklist L; L=(linklist)malloc(sizeof(node)); if(!L) exit(0); printf(

printf(

****************************************************\n

*\n

printf(

printf(

****************************************************\n

}

/*----------------------------Main:主函数。----------------------------*/

void main()

{

int choice;

menu();

printf(

scanf(

while(choice)

{

switch(choice)

{

case 1: printf(

case 2: printf(

case 3: exit(0);

default:printf(

}

menu();

printf(

scanf(

}

}

六、 程序运行结果

目 录

一、 问题描述 .................................... 1

二、 问题分析 .................................... 2

三、 数据结构描述................................. 2

四、 算法设计 .................................... 2

五、 详细程序清单................................. 4

六、 程序运行结果................................ 11

七、 心得体会 ................................... 12

一、 问题描述

1. 约瑟夫问题描述

编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。

2. 八皇后问题描述

在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相

3、界面设计模块问题描述

设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要 简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。

二、 问题分析

在整个课程设计中,我主要负责的是约瑟夫问题中链表中的出列的操作算法的设计。用循环单链表表示编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始输入一个正整数作为报数的上限值turn,从第一个人开始按顺时针方向自1开始顺序报数(即从第一个结点开始指针向后移动),报到turn-1时(即指针指向turn-1个结点时)停止,他的下一位出列,将他的下一位密码作为新的turn值,从出列的人的的顺时针方向上的下一个开始重新从1报数,如此下去,直至链表中只剩一位(即一个结点)退出循环,并所有人的编号按出列顺序输出。在实现的过程中定义i表示报数的循环次数,因为每次循环都会有一个人出列且只剩一个人时结束循环,所以i

三、 数据结构描述

typedef struct LNode{

int data;

struct LNode *next;

}node,*linklist; //单链表解决约瑟夫问题时储存结点信息

在单循环链表中进行出列的操作,方便、快捷、易理解。链表中的结点及其指针域、数值域之间的联系与各种赋值与转换使得出列操作的思路变得清晰简单。

四、 算法设计

我负责的是约瑟夫问题中链表中的出列的操作算法。

1. 算法流程图

2. 具体算法设计

void chulie(linklist L,int number)

{

} int turn,i,j; linklist p,s; printf(

五、 详细程序清单

#include

#include

#include

//八皇后问题

int count;int m,n;

int a[8];

int c[15];

int d[8][8];

int check(int i,int j);

void putchess(int i);

void takeposition(int i, int j);

void leaveposition(int i, int j);

void show( void );

void Queenstart(void)

{

count = 0;

for(m=0;m

{

a[m]=0;

for(n=0;n

{ d[m][n]=0; }

}

for(m=0;m

{

b[m]=0;

c[m]=0;}

}

void putchess(int i)

{

int j;

if(i

{

for(j=1;j

{

if(1==check(i,j))

takeposition(i,j);

putchess(i+1);

leaveposition(i,j);

}

}

}

else if(8==i)

{

for(j=1;j

{

if(1==check(i,j))

{

takeposition(i,j);

show();

leaveposition(i,j);

}

}

}

}

int check(int i,int j)

{

if(0==a[j-1] && 0==b[i+j-2] && 0==c[i-j+7])

{

return 1;

}

else

{

return 0;

}

void takeposition(int i, int j)

{

a[j-1]=1;

b[i+j-2]=1;

c[i-j+7]=1;

d[i-1][j-1]=1;

}

void leaveposition(int i, int j)

{

a[j-1]=0;

b[i+j-2]=0;

c[i-j+7]=0;

d[i-1][j-1]=0;

}

void show( )

{

count++;

printf(

for(m=0;m

{

for(n=0;n

{

if(0==d[m][n])

printf(

else

printf(

}

printf(

}

}

//约瑟夫环问题

typedef struct LNode{

int data;

int code;

struct LNode *next;

}node,*linklist;

linklist creatstart(linklist L,int number)

{

int m,i;

linklist s,p;

s=L; for(i=1;i

p->data=i;

printf(

p->next=NULL;

s->next=p;

s=p;

}

s->next=L->next;

return s;

}

void chulie(linklist L,int number)

{

int turn,i,j;

} printf(

void lianbiao()

{

int number;

}

/*---------------------------- 主菜单 ----------------------------*/ void menu(){

linklist L; L=(linklist)malloc(sizeof(node)); if(!L) exit(0); printf(

printf(

****************************************************\n

*\n

printf(

printf(

****************************************************\n

}

/*----------------------------Main:主函数。----------------------------*/

void main()

{

int choice;

menu();

printf(

scanf(

while(choice)

{

switch(choice)

{

case 1: printf(

case 2: printf(

case 3: exit(0);

default:printf(

}

menu();

printf(

scanf(

}

}

六、 程序运行结果


相关文章

  • 约瑟夫环课程设计实验报告
  • <数据结构> 课程设计报告 课程名称: 课程设计题目: 姓名: 院系: 专业: 年级: 学号: 指导教师: <数据结构>课程设计 joseph环 计算机学院 2011年12月18日 目 录 1 课程设计的目的---- ...查看


  • 软件实习总结报告
  • ********** --约瑟夫环游戏 总结报告 学生姓名:高娃 学 号:11071202 专业班级:计算机11-2 指导教师:李晓旭 宫法明 2012年7月14日 专业实习报告 摘 要 游戏自人类出现以后便日渐完善.进入20世纪后,人类进 ...查看


  • 数据结构课程设计之约瑟夫问题
  • 设计题目:3.3"银行排队系统"的设计与实现P44 ........................................................... 错误!未定义书签. 一.设计要求 . ..... ...查看


  • 八皇后实验报告
  • 数据结构实验报告 实验名称: 实验二--八皇后问题 学生姓名: 姜山 班 级: 2011211106 班内序号: 14 学 号: 2011210167 日 期: 2012年11月16日 1. 实验要求 [实验目的] 1. 进一步掌握指针.模 ...查看


  • 神游卢浮宫(二)[拿破仑一世与约瑟芬皇后加冕礼]
  • 这些人在做什么? 他们在参加一场重要的仪式,拿破仑和他的妻子约瑟芬 · 博阿尔内(Joséphine de Beauharnais)的加冕礼.当时,拿破仑统治法国,并且在随后的几年间攻占了欧洲的大片土地.位于画面右边的几个人手里拿着几件东西 ...查看


  • 艺术学科校本课程资源的开发与利用
  • <艺术学科校本课程资源的开发与利用> 课 题 研 究 方 案 石狮市实验小学艺术组 吴旭华 一.课题的核心概念及界定 <艺术学科校本课程资源的开发与利用>课题的关键词:"艺术学科" ." ...查看


  • 中南大学算法实验报告
  • 算法分析与设计 实验报告 学院: 信息科学与工程学院 专业班级: i got7 指导老师: 学号: i got7 姓名: 鸟宝宝 a. 合并排序 合并排序是分治法的应用,把需要排序的数组A[1 - n],一分为二A[1 -n/2]和A[n/ ...查看


  • 计算机世界最具影响力的20人
  • 转自: 计算机世界最具影响力的20人 1.约翰•冯•诺依曼 (John Von Neuman, 1903- 1957) 被誉为"电子计算机之父".他对人类的最大贡献是对计算机科学.计算机技术和数值分析的开拓性工作,194 ...查看


  • 思政硕士生文献综述
  • 论高校思想政治教育中的体验式教育 --第二次学术报告暨文献综述 摘要:我们党和国家历来重视思想政治教育工作, 尤其是高校思想政治教育工作,特别是改革开放以来,广大学者在高校思政领域的积极探索,使思想政治教育取得了累累硕果.在新的历史时期,为 ...查看


热门内容