#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;
}