c语言-算法课程设计-会场安排

来源:互联网 发布:sql数据库置疑怎么解决 编辑:程序博客网 时间:2024/06/07 21:50

会场安排


**

问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.设计一个有效的贪心算法进行安排.(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相连顶点着不同颜色的最少着色数,相应于要找最少会场数.)

**


程序内容包含
1.可自定义活动个数
2.可以使用文件和窗口两种方法对活动时间进行录入
2.对时间进行合法判断时间大于0小于24


运行结果:

这里写图片描述


这里写图片描述


这里写图片描述

源代码:

meeting.h

#ifndef __MEETING_H__#define __MEETING_H__#include <iostream>#include <Windows.h>using namespace std;#define MAX 100#define DataType inttypedef struct Acticity {    DataType t;    bool isST;}Acticity;void Init(Acticity ac[MAX],int anum);void InitFile(Acticity ac[MAX],int anum);void Sort(Acticity ac[MAX],int anum);int FindNice(Acticity ac[MAX],int anum);#endif

meeting.cpp

#define _CRT_SECURE_NO_WARNINGS 1#include "meeting.h"void Init(Acticity ac[MAX],int anum){    int i = 0;    int j = 0;    printf("请输入活动开始时间和结束时间以空格隔开(0-24h):\n");    for (i=0;i<anum*2;i++)    {        if (i%2==0)        {            cin>>ac[i].t;            ac[i].isST = true;        }        else        {            cin>>ac[i].t;            ac[i].isST = false;        }    }    while(j<anum*2)    {        if ((ac[j].t>ac[j+1].t)||(ac[j].t<0)||(ac[j+1].t<0)||(ac[j].t>24)||(ac[j+1].t>24))        {            printf("Time error\n");            printf("Check your time!\n");            exit(EXIT_FAILURE);        }        j=j+2;    }}void InitFile(Acticity ac[MAX],int anum){    int i = 0;    int j = 0;    FILE *fp = fopen("input.txt","r");    if (fp==NULL)    {        perror("open file");        exit(EXIT_FAILURE);    }    for (i=0;i<2*anum;i++)    {        fscanf(fp,"%d",&ac[i].t);    }    fclose(fp);    for (i=0;i<anum*2;i++)    {        if (i%2==0)        {            ac[i].isST = true;        }        else        {            ac[i].isST = false;        }    }    while(j<anum*2)    {        if ((ac[j].t>ac[j+1].t)||(ac[j].t<0)||(ac[j+1].t<0)||(ac[j].t>24)||(ac[j+1].t>24))        {            printf("Time error\n");            printf("Check your time!\n");            exit(EXIT_FAILURE);        }        j=j+2;    }}void Sort(Acticity ac[MAX],int anum){    DataType tmp;    bool box;    for (int i=0;i<anum*2;i++)    {        for (int j =i;j<anum*2;j++)        {            if (ac[j].t<ac[i].t)            {                tmp =ac[j].t;                ac[j].t = ac[i].t;                ac[i].t = tmp;                box = ac[j].isST;                ac[j].isST = ac[i].isST;                ac[i].isST = box;            }        }    }    /*for (int i = 0;i<2*anum;i++)    {        cout<<ac[i].t<<" "<<ac[i].isST<<endl;    }*///输出结果}int FindNice(Acticity ac[MAX],int anum){    int count[MAX];    count[0] = 1;    for (int i = 1;i<anum*2;i++)    {        if (ac[i].isST == true)        {            count[i] = count[i-1]+1;        }        else        {            count[i] = count[i-1]-1;        }    }    int maxcount = count[0];    for (int i = 1;i<anum*2;i++)    {        if (count[i]>maxcount)        {            maxcount = count[i];        }    }    return maxcount;}

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1#include "meeting.h"void menu(Acticity ac[MAX]){    int anum = 0;    while (1)    {        int maxcount = 0;        int input = 0;        int i = 0;        printf("*******************************\n");        printf("*******  1.输入活动数目 *******\n");        printf("*******    2.窗口输入   *******\n");        printf("*******    3.文件输入   *******\n");        printf("******* 4.查找最优会场数*******\n");        printf("*******     0. 退出     *******\n");        printf("*******************************\n");        printf("请选择:");        cin>>input;        switch (input)        {        case 2:            Init(ac,anum);            break;        case 3:            printf("正在读取文件!\n");            for (i=0;i<31;i++)            {                printf("*");                if (i==30)                {                    printf("\n");                }                Sleep(100);            }            printf("读取完成!\n");            InitFile(ac,anum);            break;        case 4:            Sort(ac,anum);            maxcount = FindNice(ac,anum);            cout<<"最好的会场数:";            cout<<maxcount<<endl;            break;        case 1:            printf("请输入活动个数:");            cin>>anum;            break;        case 0:            return;        default:            printf("选择有错\n");            break;        }    }}int main (){    Acticity ac[MAX];    menu(ac);    return 0;}
原创粉丝点击