离散数学的应用(c++实现)

文章描述了一个C++程序,用于处理交大社团8人头脑风暴活动中的人际交流问题。程序通过矩阵表示交流关系,确保每个人至少与4人交流,并能与相邻两人交流。程序包含初始化、创建交流矩阵、创建随机落座顺序和遍历矩阵等功能,满足活动需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:交大某社团要举办一次头脑风暴,有8人参加,已知每人至少会与其余7人中的4人交流,问该社团工作人员能否将他们安排在同一张圆桌周围就座,使每个人都能与两边的人交流。

交流关系在计算机中的表示
利用矩阵来表示两个人之间是否交流,元素为0时代表没有交流,元素为1时代表有交流。矩阵中的行列表示座位的相对顺序,即第i行是第i个座位,i行i列代表第i个座位上的人与第j个座位上的人有交流,人的顺序之后加入,从而保证这个座位的人一定能与相邻两边的人能交流。
利用一整型数组储存这八个人的顺序,也作为矩阵的行列头元素。
根据题意,“每人会与其余7人交流”,即每个人不与自己交流,故矩阵主对角线元素恒为0。而若使“每个人都能与两边的人交流”,则将主对角线左右相邻的两个元素置为1,表示坐在这个座位上的人恒与左右两边的人能交流,不用考虑人落座的顺序。


在这里插入图片描述

一.“vertex.h”

函数功能在这里插入图片描述

matrix数组代表矩阵,elemen数组代表人座位的顺序。
Init函数将上述两个数组初始化为0,createMatrix函数根据座位的相对位置创造交流关系,createElement函数创造一个(伪)随机落座顺序,traversal函数遍历矩阵。

二.“vertex.cpp”

关键代码解释
void creatMatrix();//创造交流关系
在这里插入图片描述

在第一次for循环中,将主对角线元素左右相邻两个元素全置为1,表示坐该座位的人嫩与两边相邻的人有交流,此时每个人都与别人(左右相邻的人)有了两次交流。
在第二次for循环中,依次输入每个人要进行多少次交流(大于等于四次,小于等于七次),再根据相应的次数来决定与谁交流。决定与谁交流的过程是一个伪随机的过程,在嵌套的for循环中,寻找还未与这个人进行交流的人(除了自己),将元素的值赋值为1,表示与这个人进行了交流。

void createElement();//创造顺序(伪随机)在这里插入图片描述

这个函数创造随机落座顺序,但是由于人数过少只能产生固定的顺序。实际上,在这个程序中,每个人落座的顺序并不重要,因为矩阵代表的是一个座位(上的人)与另一个座位(上的人)有交流,无论顺序如何,根据座位的相对位置,总能满足要求。

#include "vertex.h"
#include <iostream>
#include <string.h>
void vertex::Init(){
    memset(matrix,0,sizeof(matrix));
    memset(element,0,sizeof(matrix));
}

//主对角线元素恒为0,即自己不跟自己交流
//矩阵元素为1,代表与其交流
void vertex::creatMatrix(){
    for(int i = 0;i < SIZE;i++){
        if(i == 0){//第一个座位
            matrix[i][i + 1] = 1;
            matrix[i][SIZE-1] = 1;
        }
        else if(i == SIZE-1){//其余座位
            matrix[i][i-1] = 1;
            matrix[i][0] = 1;
        }
        else{//最后一个座位
            matrix[i][i-1] = 1;
            matrix[i][i + 1] = 1;
        }
    }
    
    int n,num;
    for(int i = 0;i < SIZE;i++){
        n = 0;
        printf("\n输入同学%d交流的人数:",element[i]);
        scanf("%d",&num);
        if(num < 4 || num == 8){
            printf("人数错误!请重新输入!\n");
            i--;
        }
        else{
            for(int j = 0;j < SIZE;j++){
                if(n == num - 2)//减去相邻两个座位
                    break;
                if(matrix[i][j] == 0 && i!=j){
                  matrix[i][j] = 1;
                  n++;
                }
            }
        }
    }
}

void vertex::traversal(){
    for(int i = 0;i < SIZE;i++)
        printf(" %2d",element[i]);
    
    printf("\n");
    for(int i = 0;i < SIZE;i++){
        printf("%d",element[i]);
        for(int j = 0;j < SIZE;j++)
           printf("%2d ",matrix[i][j]);
        printf("\n");
    }
}

void vertex::createElement(){
    int max = SIZE,pos;
    for(int j = 0;j < SIZE;j++){//确保每个人都在
        pos = rand()%max + 1;
        if(element[pos-1] == 0)//判断是否重复
           element[pos-1] = pos;
        else{
            int i;
            for (i = 0; i < SIZE; i++) //若重复,顺延下一个进入数组
               if(element[i] == 0)
                   element[i] = i+1;
        }
    }
}
#include <iostream>
#define SIZE 8
class vertex
{
private:
    int matrix[SIZE][SIZE];
    int element[SIZE];
    
public:
    void Init();//初始化矩阵、顺序数组
    void creatMatrix();//创造交流关系
    void traversal();//遍历矩阵
    void createElement();//创造顺序(伪随机)
};```
![在这里插入图片描述](https://img-blog.csdnimg.cn/4da96c3d3590425a826768fea3702862.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/16ce030acb1b499eac231cf7d5e412d3.png)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值