📄 preschemecal.cpp
字号:
// PreSchemeCal.cpp: implementation of the CPreSchemeCal class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RepComb.h"
#include "PreSchemeCal.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPreSchemeCal::CPreSchemeCal()
{
m_pScheme=NULL;
m_nn=m_nLength=0;
}
CPreSchemeCal::~CPreSchemeCal()
{
if(m_nLength>0)
delete[] m_pScheme;
}
void CPreSchemeCal::initiate(int SLength)
{
if(SLength<1||SLength%2==0)return;
if(SLength/2>m_nLength)
{
delete[] m_pScheme;
m_nLength=SLength/2;
m_pScheme=new int[m_nLength+1];
m_nn=m_nLength;
}
else m_nn=SLength/2;
for(int nIndex=0;nIndex<m_nn;nIndex++)
m_pScheme[nIndex]=nIndex;
m_pScheme[m_nn]=2*m_nn+2;
}
bool CPreSchemeCal::next()
{
int nIndex=m_nn-1;
bool bFound;
do
{
bFound=true;
m_pScheme[nIndex]++;
while(nIndex>0&&!IsSelectable(nIndex,m_pScheme[nIndex]))
{
if(m_pScheme[nIndex]+1==m_pScheme[nIndex+1])
{
nIndex--;
m_pScheme[nIndex]++;
}
else m_pScheme[nIndex]++;
}
if(nIndex==0) return false;
nIndex++;
while(nIndex<m_nn&&bFound)
{
m_pScheme[nIndex]=m_pScheme[nIndex-1]+1;
while(m_pScheme[nIndex]+1<m_pScheme[nIndex+1]
&&!IsSelectable(nIndex,m_pScheme[nIndex]))
m_pScheme[nIndex]++;
if(m_pScheme[nIndex]+1==m_pScheme[nIndex+1])
{
bFound=false;
nIndex--;
}
else nIndex++;
}
}while(!bFound);
return true;
}
bool CPreSchemeCal::IsSelectable(int nIndex, int n)
{
if(nIndex<0||nIndex>m_nn-1||n<0||n>2*m_nn) return false;
bool bSelectable=false;
if(m_pScheme[nIndex]+1<m_pScheme[nIndex+1])
{
int cOperator,cOperand;
cOperator=m_nn-nIndex;
cOperand=((2*m_nn+1)-n)-cOperator;
if(cOperator+1<=cOperand)
bSelectable=true;
}
return bSelectable;
}
void CPreSchemeCal::get(int a[])
{
int i=2*m_nn;
while(i>=0)
a[i--]=0;
for(i=0;i<m_nn;i++)
a[m_pScheme[i]]=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -