preschemecal.cpp

来自「穷举法进行三八二十四的计算。列举所有可能的表达式进行计算筛选。」· C++ 代码 · 共 107 行

CPP
107
字号
// 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 + =
减小字号Ctrl + -
显示快捷键?