{
matrix=MATRIX(rows.size(),vector
for(int i=0;i
}
void CExactCoverSolution::print(ostream&os ) const
{
os << m_solution[0];
for (int i=1;i
os << ","<
}
#include "ExactCoverSolution.h"
CExactCoverSolution
::CExactCoverSolution(const MATRIX& matrix
,const SUBSET_NAMES& names
)
:m_matrix(matrix)
,m_subsetNames(names)
,m_elementNum(matrix[0].size())
,m_subsetNum(matrix.size())
{
}
CExactCoverSolution::~CExactCoverSolution(void)
{
}
int CExactCoverSolution::GetMinColumnIndex( int &sum ) const
{
int ColumnIndex=0;
sum=GetColumnCount(ColumnIndex);
for(int i=1;i
int newSum=0;
if ((newSum=GetColumnCount(i))
sum=newSum;
ColumnIndex = i;
}
}
return ColumnIndex;
}
bool CExactCoverSolution::search()
{
bool flag = false;
int rowIndex=-1;
//如果矩阵为空,则说明所有元素已经被得到已经得到可行解。
if (m_matrix.size()==0)
flag=true;
//如果有全1的行,则将该行加入到可行解中,并返回真
else if ((rowIndex=getFullOneRow())>=0)
{
m_solution.push_back(m_subsetNames[rowIndex]);
flag =true;
}
else
{
int sum=0;
int c =GetMinColumnIndex(sum);
if (sum==0)
flag =false; //如果有全0的列,则说明此时一定无解
else
{
//得到和第c列相交的所有行列表
vector
getRowNos(c,rows);
for(int i=0;i
int r=rows[i];
//得到和本行不相交的所有列
vector
getColumnNos(r,columns,0);
vector
getOtherRows(r,other);
SUBSET_NAMES names;
getNewNames(other,names);
MATRIX matrix;
getNewMatrix(other,columns,matrix);
CExactCoverSolution s(matrix,names);
flag = s.search();
if (flag)
{
m_solution.push_back(m_subsetNames[r]);
m_solution.insert(m_solution.end(),s.m_solution.begin(),s.m_solution.end());
break;
}
}
}
}
return flag;
}
//判断某一行是否全1
bool CExactCoverSolution::isFullOneRow(int rowIndex) const
{
bool flag =true;
for (int i=0;i
{
flag=false;
break;
}
return flag;
}
int CExactCoverSolution::getFullOneRow() const
{
bool flag =false;
int rowIndex = -1;
for (int i=0;i
if (isFullOneRow(i))
{
rowIndex = i;
break;
}
}
return rowIndex;
}
int CExactCoverSolution::GetColumnCount( int columnIndex ) const
{
int sum=0;
for(int i=0;i
return sum;
}
void CExactCoverSolution::getRowNos( const int c,vector
{
for (int i=0;i
rows.push_back(i);
}
void CExactCoverSolution::getColumnNos( const int r,vector
{
for (int i=0;i
columns.push_back(i);
}
void CExactCoverSolution::getOtherRows( const int r,vector
{
for(int i=0;i
bool flag=true;
for(int j=0;j
{
flag=false;
break;
}
if (flag)
otherrows.push_back(i);
}
}
void CExactCoverSolution::getNewNames( const vector
{
for(int i=0;i
}
void CExactCoverSolution::getNewMatrix( const vector
{
matrix=MATRIX(rows.size(),vector
for(int i=0;i