您的位置:首页 > 其它

排列组合分配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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排列组合