帮忙修改下舞伴搭配问题 急急急!!!!!!!
[问题描述]一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴.
请设计一系统模拟动态地显示出上述过程,要求如下:
1) 输出每曲配对情况
2) 计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.
3) 尽量设计出多种算法及程序,可视情况适当加分
提示:用队列来解决比较方便.
缺少个头文件 大家修改下
#include <iostream.h>#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef int Status;
int boyscount=0,girlscount=0; //全局变量
int Lcm(int ,int ); //求最小公倍数(lease common multiple)
//-------循环队列-队列的顺序存储结构----
//#define MAXQSIZE 100
typedef int QElemType;
typedef struct {
QElemType *base;
int front;
int rear;
}SqQueue;
//---循环队列的基本算法--------
Status InitQueue(SqQueue &Q,int &MAXQSIZE){
//构造一个空队列
Q.base=(QElemType *)malloc((MAXQSIZE+1) *sizeof(QElemType));
if(!Q.base)exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
int Queuelength(SqQueue Q,int MAXQSIZE){
//返回Q的元素个数,即队列长度
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status EnQueue (SqQueue &Q,QElemType e,int MAXQSIZE){
//入队列,插入元素e为Q的新的队尾元素
if((Q.rear+1)%(MAXQSIZE+1)==Q.front) return ERROR; //队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%(MAXQSIZE+1);
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e,int MAXQSIZE){
//若队列不空,则删除Q的对头元素,用e返回其值,并返回OK
//否则返回ERROR
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%(MAXQSIZE);
return OK;
}
void Init(SqQueue &Boys,SqQueue &Girls){
printf("\n『初始化』"); //标题
printf("\n请输入男女生人数,空格分隔:");
scanf("%d%d",&boyscount,&girlscount);
InitQueue(Boys,boyscount);
for(int i=0;i<boyscount;i++){
EnQueue (Boys,i+1,boyscount); //给男生编号123...
}//for
InitQueue(Girls,girlscount);
for(i=0;i<girlscount;i++){
EnQueue (Girls,i+1,girlscount); //给女生编号
}//for
printf("初始化完毕\n");
}//Init
void Match(SqQueue Boys,SqQueue Girls){
printf("\n『输出每曲配对情况』");
if(boyscount==0){
printf("\n 请先初始化!\n");
return;
}//if
int n;
printf("\n请输入曲目数:");
scanf("%d",&n);
int Id_boy,Id_girl;
printf("\n曲目 男 女\n");
for(int i=1;i<=n;i++){
DeQueue(Boys,Id_boy,boyscount);
DeQueue(Girls,Id_girl,girlscount);
printf("%3d %3d <---> %3d\n",i,Id_boy,Id_girl);
//输出每曲配对情况
}//for
}//Match
void AntiMatch(SqQueue Boys,SqQueue Girls){
printf("\n『求满足条件的曲目』");
if(boyscount==0){
printf("\n 请先初始化!\n");
return;
}//if
int x,y;
printf( "\n请输入男女编号,空格分隔:");
scanf("%d%d",&x,&y);
int Id_boy,Id_girl;
for(int i=1;i<=Lcm(boyscount,girlscount);i++){
DeQueue(Boys,Id_boy,boyscount);
DeQueue(Girls,Id_girl,girlscount);
if((Id_boy==x)&&(Id_girl==y)) break;
}//for
if((Id_boy==x)&&(Id_girl==y)){
printf("两人会在第%d曲和第%d曲搭配.\n",i,i+Lcm(boyscount,girlscount));
return;
}//if
printf("抱歉,你输入的两人不可能搭配!\n");
}//AntiMatch
int Lcm(int m,int n){//求最小公倍数(lease common multiple)
int temp,p,r;
if(n<m){
temp=n;
n=m;
m=temp; //把大数放在n中,小数放在m中
}//if
p=n*m;
while(m!=0)
{
r=n%m;
n=m;
m=r;
}//while
return p/n;
}//Lcm
#include "Students.h"
void main(){
SqQueue Boys,Girls;
system("title 学生搭配问题"); //标题
system("color 17");
//设置背景/字体颜色,1为背景,7为前景,其值可随便设,系统默认为07
Begin:
printf("\n");
printf(" ╔════════╗\n");
printf(" ║ 学生搭配问题 ║\n");
printf(" ╚════════╝\n");
printf(" 1.初始化\n");
printf(" 2.输出每曲配对情况\n");
printf(" 3.求满足条件的曲目\n");
printf(" 4.退出\n");
char choice;
switch(choice=getch()){
case '1': Init(Boys,Girls);break; //初始化
case '2': Match(Boys,Girls);break; //输出每曲配对情况
case '3': AntiMatch(Boys,Girls);break; //求满足条件的曲目
case '4': return; //退出
}//switch
goto Begin;
}//main 额~
我也在学,实训题目刚好是舞伴问题,不过我C和C++都是混过来的,现在终于想学了,不知道来不来得及[tk02]
言规正传:你的程序编译发现的错误是error C2018: unknown character '0xa1',剧我摆渡一下的结果的:在出错的那一行里面有中文输入法的空格
貌似还要把main上面的头文件//#include "Students.h"屏壁掉
鉴定完毕,不知道对不对
PS:我真的不懂编程啊[tk13] 大虾们拍砖轻点~
页:
[1]
