编程论坛's Archiver

xinjie6872 发表于 2008-2-27 11:01

帮忙修改下舞伴搭配问题 急急急!!!!!!!

[问题描述]
一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴.
  请设计一系统模拟动态地显示出上述过程,要求如下:
   1)        输出每曲配对情况
   2)        计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.
   3)        尽量设计出多种算法及程序,可视情况适当加分
提示:用队列来解决比较方便.

xinjie6872 发表于 2008-2-27 11:04

缺少个头文件 大家修改下

#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

bccnlyb 发表于 2008-7-3 21:38

额~
我也在学,实训题目刚好是舞伴问题,不过我C和C++都是混过来的,现在终于想学了,不知道来不来得及[tk02]

言规正传:你的程序编译发现的错误是error C2018: unknown character '0xa1',剧我摆渡一下的结果的:在出错的那一行里面有中文输入法的空格
貌似还要把main上面的头文件//#include "Students.h"屏壁掉

鉴定完毕,不知道对不对
PS:我真的不懂编程啊[tk13] 大虾们拍砖轻点~

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.