题目:交大某社团要举办一次头脑风暴,有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();//创造顺序(伪随机)
};```

