目 录
一、 问题描述 .................................... 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(
}
}
六、 程序运行结果