本文参考严蔚敏版数据结构第四章循环队列应用部分,用C++实现对划分无冲突子集的编写,本文队列基本操作实现部分参考 http://blog.csdn.net/u014328804/article/details/52845901。
C++代码如下(VS2015验证通过):
主函数部分:
#include
#include "queue.h"
#define ITEM 9
void diveideGroup(int clash[][ITEM], size_t n, int result[]);
int main()
{
//定义冲突矩阵
int clashMatrix[ITEM][ITEM] = {
0,1,0,0,0,1,0,0,0,
1,0,0,0,1,1,0,1,1,
0,0,0,0,0,1,1,0,0,
0,0,0,0,1,0,0,0,1,
0,1,0,1,0,0,1,0,1,
1,1,1,0,0,0,1,0,0,
0,0,1,0,1,1,0,0,0,
0,1,0,0,0,0,0,0,0,
0,1,0,1,1,0,0,0,0
};
//定义用来存放分组结果的数组
int result[ITEM] = { 0 };
diveideGroup(clashMatrix, ITEM, result);
//输出分组的结果
for (const auto &e : result)
{
std::cout << e << " ";
}
std::cout << std::endl;
return 0;
}
//无冲突分组函数定义
void diveideGroup(int clashMatrix[][ITEM], size_t n,int result[])
{
int GroupIndex = 0; //组别
Queue q;
createQueue(q); //创建循环队列
//添加体育项目的编号0~8
for (size_t i = 0; i < n; i++)
{
addElem(q, i);
}
int PreIndex = q.rear; //初始循环队列最后一个元素的索引
int curVal = *q.base; //存储初始队列的首元素
int clash[ITEM] = { 0 }; //定义单个元素的冲突数组
while (!IsEmpty(q))
{
++GroupIndex;
//冲突数组
for (size_t i = 0; i < n; i++)
{
clash[i] = clashMatrix[q.base[q.front]][i];//冲突矩阵的某一行
}
while(q.front!=PreIndex)
{
deleteElem(q, curVal);
if (clash[curVal] == 0)
{
result[curVal] = GroupIndex;
for (size_t i = 0; i < n; i++)
{
clash[i] += clashMatrix[i][curVal];
}
}
else
{
addElem(q, curVal);
}
}
PreIndex = q.rear;//下一次循环的终止的条件就是上次循环最终改的时候的变量的值
}
}
头文件队列基本操作声明:
#pragma once //重复包含处理
#define QUEUEMAXLEN 10 //循环队列的最大程度,尾指针指向最后一个元素的下一个位置
//队列的结构形式
typedef struct Queue {
int* base; //队列的基地址
int front;
int rear; //仅仅是指向数组中某个元素的整型参量
}cycQueue;
/*循环队列的方法*/
//创建队列
bool createQueue(Queue &q);
//判断队列是否为空
bool IsEmpty(Queue q);
//获取队列的长度
int queueLength(Queue q);
//队头删除元素 考虑的是:是否有数据可以进行删除的问题
bool deleteElem(Queue &q,int &elem);
//队尾添加元素 考虑的是:是否
bool addElem(Queue &q,int elem);
//打印队列的元素
void printQueue(Queue &q);
头文件队列基本操作定义:
#include "queue.h"
#include
//创建队列
bool createQueue(Queue &q)
{
q.base = new int[QUEUEMAXLEN];
if (q.base == nullptr)
return false;
q.front = q.rear = 0;
return true;
}
// 判断队列是否为空
bool IsEmpty(Queue q)
{
if (q.front == q.rear)
return true;
return false;
}
//获取队列的长度
int queueLength(Queue q)
{
return (q.rear - q.front + QUEUEMAXLEN) % QUEUEMAXLEN;
}
//队头元素删除
bool deleteElem(Queue &q, int &elem)
{
if (q.front == q.rear)
return false;
elem = q.base[q.front];
q.front = (q.front + 1) % QUEUEMAXLEN;
return true;
}
//队尾添加元素
bool addElem(Queue &q, int elem)
{
if ((q.rear + 1) % QUEUEMAXLEN == q.front)
return false;
q.base[q.rear] = elem;
q.rear = (q.rear + 1) % QUEUEMAXLEN;
}
//打印队列的元素
void printQueue(Queue &q)
{
int i = q.front;
while(i != q.rear)
{
std::cout << " ";
i = (i + 1) % QUEUEMAXLEN;
}
std::cout << std::endl;
}
运行结果图: