本文参考严蔚敏版数据结构第四章循环队列应用部分,用C++实现对划分无冲突子集的编写,本文队列基本操作实现部分参考
http://blog.csdn.net/u014328804/article/details/52845901。
C++代码如下(VS2015验证通过):
主函数部分:
#include <iostream>
#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 <iostream> //创建队列 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; }
运行结果图: