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

本文展示了一个使用C++实现的排列组合示例程序,该程序通过不同的条件筛选出特定的排列组合,如确保每个性别旁边至少有一位异性、整体上至少两对面对面的异性等。通过实际代码演示了如何利用C++标准库函数next_permutation来获取所有可能的排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值