#include<iostream>
#include<string>
using namespace std;
typedef struct Etype
{
int num;
string name;
string place;
}Etype;
typedef struct queue
{
Etype*element;
int front;
int rear;
int maxqueuesize;
}queue;
void creat(queue&L,int maxsize)
{
L.maxqueuesize=maxsize;
L.element=new Etype[L.maxqueuesize+1];
L.front=0;
L.rear=0;
}
bool isfull(queue&L)
{
if(L.front==(L.rear+1)%(L.maxqueuesize+1)) return 1;
return 0;
}
bool isempty(queue&L)
{
if(L.front==L.rear) return 1;
return 0;
}
bool enqueue(queue&L,Etype&M)
{
if (isfull(L)) return 0;
L.rear=(L.rear+1)%(L.maxqueuesize+1);
L.element[L.rear]=M;
return 1;
}
bool dequeue(queue&L,Etype&M)
{
if (isempty(L)) return 0;
L.front=(L.front+1)%(L.maxqueuesize+1);
M=L.element[L.front];
return 1;
}
void output(queue&L) //输出队列中的投资方法
{
Etype out;
while(!isempty(L))
{
dequeue(L,out);
cout<<out.num<<" "<<out.name<<" "<<out.place<<endl;
}
}
void divide(queue&L,int n,int*s) //对输入的项目分配投资方法
{
Etype leave,db;
int rearkeep; //用于标记结束的rear
queue*queuehold=new queue[n]; //用作保留可行投资方法的队列
queue*queuekeep=new queue[n]; //中转队列
for(int m=0;m<n;m++)
{
creat(queuehold[m],n);
creat(queuekeep[m],n); //创建空队列
}
int set=0; //set用于标记投资方法的数目
while(!isempty(L)) //第一层循环确保所有输入项目分配完毕
{
rearkeep=L.rear;
while(L.front!=rearkeep) //第二层循环确保未被分配的项目遍历完毕
{
dequeue(L,leave);
int flag=1; //用于标记是否能够进入目前投资方案
while(!isempty(queuehold[set])) //第三层循环与已经分配进去的投资项目进行对比
{
dequeue(queuehold[set],db);
enqueue(queuekeep[set],db);
if(*(s+leave.num*n+db.num)) flag=0;
}
while(!isempty(queuekeep[set])) //重置
{
dequeue(queuekeep[set],db);
enqueue(queuehold[set],db);
}
if(flag) enqueue(queuehold[set],leave); //放置项目
else enqueue(L,leave);
}
set++;
}
for(int i=0;i<set;i++) //输出投资方法
{
cout<<i+1<<"种投资方法为:"<<endl;
output(queuehold[i]);
}
}
int main()
{
queue L;
creat(L,9);
int a[9]={0,1,2,3,4,5,6,7,8};
string b[9]={"项目1","项目2","项目3","项目4","项目5","项目6","项目7","项目8","项目9"};
string c[9]={"ww1","ww2","qq1","qq2","over1","over2","over3","sweet1","sweet2"} ;
Etype in;
for(int i=0;i<9;i++)
{
in.num=a[i];
in.name=b[i];
in.place=c[i];
enqueue(L,in);
}
int s[9][9]={{0,1,0,0,0,0,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,1,1,0,1},{0,1,1,0,1,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 n=9;
divide(L,9,*s);
return 0;
}