排列组合分配8人桌男女座位
2017-04-24 18:39
501 查看
#include <opencv2/opencv.hpp>
#define _USE_MATH_DEFINES
#include <math.h>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace
cv;
using namespace
std;
//座位旁边至少一位异性
int IsNearToZero(int data[],int nNum);
//整个分配至少有两位对面是异性
int IsTwoDuiCheng(int data[],int nNum);
//一个左侧和对面为异性,右侧为同性
int IsRightOtherDui(int data[],int nNum);
//一个男性在女性中间
int IsInTheMid(int data[],int nNum);
int main( int argc,
char**)
{
int myints[] = {1,1,1,1,-1,-1,-1,-1};
sort (myints,myints+8);
int nCount =0;
do {
// cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << ' '<< myints[3]<< ' '<< myints[4]<< ' '<< myints[5]<< ' '<< myints[6]<< ' '<< myints[7]<<'\n';
if (IsNearToZero(myints,8)==0 ||
IsTwoDuiCheng(myints,8)==0)
continue;
if (IsRightOtherDui(myints,8)==0 ||
IsInTheMid(myints,8)==0)
continue;
for (int i=0;i<8;i++)
{
if (myints[i]==1)
cout << "A ";
if (myints[i]==-1)
cout << "B ";
}
cout <<
endl;
nCount++;
} while ( next_permutation(myints,myints+8) );
///获取下一个较大字典序排列
cout <<
"After loop: " << nCount <<'\n';
return
0;
}
//至少两个对称异性
int IsTwoDuiCheng(int data[],int nNum)
{
int m_nCount =
0;
int nIndex = nNum/2;
for(int i=0;i<nNum/2;i++)
{
if ((data[i]+data[i+nIndex])==0)
{
m_nCount++;
}
}
if (m_nCount<2)
return 0;
return
1;
}
//左右至少一个异性
int IsNearToZero(int data[],int nNum)
{
int m_nCount =
0;
for(int i=0;i<nNum-1;i++)
{
int nIndex = i-1;
if(nIndex<0) nIndex =nNum-1;
if ((data[i]+data[nIndex])!=0&&(data[i]+data[i+1])!=0)
{
return
0;
}
}
return
1;
}
//一个左侧和对面为异性,右侧为同性
int IsRightOtherDui(int data[],int nNum)
{
int nAIndex = nNum/2;
for(int i=0;i<nNum/2;i++)
{
int nIndex = i-1;
if(nIndex<0) nIndex =nNum-1;
if ((data[i]+data[nIndex])==0&&(data[i]+data[i+1])==2 &&(data[i]+data[i+nAIndex])==0)
{
return
1;
}
}
return
0;
}
//一个男性在女性中间
int IsInTheMid(int data[],int nNum)
{
for(int i=0;i<nNum;i++)
{
int nIndex = i-1;
if(nIndex<0) nIndex =nNum-1;
if (data[i]==1 &&data[nIndex]==-1 &&data[i+1]==-1)
{
return
1;
}
}
return
0;
}
#define _USE_MATH_DEFINES
#include <math.h>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace
cv;
using namespace
std;
//座位旁边至少一位异性
int IsNearToZero(int data[],int nNum);
//整个分配至少有两位对面是异性
int IsTwoDuiCheng(int data[],int nNum);
//一个左侧和对面为异性,右侧为同性
int IsRightOtherDui(int data[],int nNum);
//一个男性在女性中间
int IsInTheMid(int data[],int nNum);
int main( int argc,
char**)
{
int myints[] = {1,1,1,1,-1,-1,-1,-1};
sort (myints,myints+8);
int nCount =0;
do {
// cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << ' '<< myints[3]<< ' '<< myints[4]<< ' '<< myints[5]<< ' '<< myints[6]<< ' '<< myints[7]<<'\n';
if (IsNearToZero(myints,8)==0 ||
IsTwoDuiCheng(myints,8)==0)
continue;
if (IsRightOtherDui(myints,8)==0 ||
IsInTheMid(myints,8)==0)
continue;
for (int i=0;i<8;i++)
{
if (myints[i]==1)
cout << "A ";
if (myints[i]==-1)
cout << "B ";
}
cout <<
endl;
nCount++;
} while ( next_permutation(myints,myints+8) );
///获取下一个较大字典序排列
cout <<
"After loop: " << nCount <<'\n';
return
0;
}
//至少两个对称异性
int IsTwoDuiCheng(int data[],int nNum)
{
int m_nCount =
0;
int nIndex = nNum/2;
for(int i=0;i<nNum/2;i++)
{
if ((data[i]+data[i+nIndex])==0)
{
m_nCount++;
}
}
if (m_nCount<2)
return 0;
return
1;
}
//左右至少一个异性
int IsNearToZero(int data[],int nNum)
{
int m_nCount =
0;
for(int i=0;i<nNum-1;i++)
{
int nIndex = i-1;
if(nIndex<0) nIndex =nNum-1;
if ((data[i]+data[nIndex])!=0&&(data[i]+data[i+1])!=0)
{
return
0;
}
}
return
1;
}
//一个左侧和对面为异性,右侧为同性
int IsRightOtherDui(int data[],int nNum)
{
int nAIndex = nNum/2;
for(int i=0;i<nNum/2;i++)
{
int nIndex = i-1;
if(nIndex<0) nIndex =nNum-1;
if ((data[i]+data[nIndex])==0&&(data[i]+data[i+1])==2 &&(data[i]+data[i+nAIndex])==0)
{
return
1;
}
}
return
0;
}
//一个男性在女性中间
int IsInTheMid(int data[],int nNum)
{
for(int i=0;i<nNum;i++)
{
int nIndex = i-1;
if(nIndex<0) nIndex =nNum-1;
if (data[i]==1 &&data[nIndex]==-1 &&data[i+1]==-1)
{
return
1;
}
}
return
0;
}
相关文章推荐
- 关于排列组合与分配问题
- 母函数与排列组合
- Day4:T3搜索 T4数学题排列组合
- 天梯赛座位分配
- 【待修改】排列组合
- 排列组合之线性排列
- 递归实现数字排列组合
- hdu1521 排列组合(指数型母函数)
- 排列组合算法小结(未完)
- Python排列组合
- 模拟退火算法应用于最优排列问题和最优组合问题 之 排列篇
- 28 - 字符串的全排列和组合
- 数据的排列组合二
- [算法]计算全排列组合数
- 【算法基础】排列与组合
- javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- Python的排列组合运用
- 51 nod 加号分配 组合数学(逆元,快速幂)
- 秒杀排列组合(上)————排列篇
- python的排列组合