排列组合分配8人桌男女座位

来源:互联网 发布:金泰妍郑秀妍关系知乎 编辑:程序博客网 时间:2024/04/30 08:01

#include <opencv2/opencv.hpp>

#define _USE_MATH_DEFINES

#include <math.h>

#include <fstream>

#include <iostream>

#include <algorithm>  


using namespacecv;

using namespacestd;

//座位旁边至少一位异性

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';

    return0;

}


//至少两个对称异性

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;

    

    return1;

}


//左右至少一个异性

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)

        {

            return0;

        }

    }

    return1;

}


//一个左侧和对面为异性,右侧为同性

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)

        {

            return1;

        }

    }

    return0;

}


//一个男性在女性中间

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)

        {

            return1;

        }

    }

    return0;

}


0 0
原创粉丝点击