[cpp] /文件node.h
#pragma once
struct CNode
{
CNode* Left; //左节点指针
CNode* Right; //右节点指针
CNode* Up; //上节点指针,对列节点,则为本列最后一个元素的指针
CNode* Down; //下节点指针,对列节点,则为本列第一个元素的指针
int name; //对普通节点,为所在子集的编号,即行号;
//对列节点,为列编号
};
struct CColumnHead:public CNode
{
int size; //本列元素的个数
};
struct CGrid:public CNode
{
CColumnHead* columnHead; //列头节点的指针
};
//文件node.h
#pragma once
struct CNode
{
CNode* Left; //左节点指针
CNode* Right; //右节点指针
CNode* Up; //上节点指针,对列节点,则为本列最后一个元素的指针
CNode* Down; //下节点指针,对列节点,则为本列第一个元素的指针
int name; //对普通节点,为所在子集的编号,即行号;
//对列节点,为列编号
};
struct CColumnHead:public CNode
{
int size; //本列元素的个数
};
struct CGrid:public CNode
{
CColumnHead* columnHead; //列头节点的指针
};
[cpp] //文件ExactCover.h
#pragma once
#include
#include
#include
#include
using namespace std;
#include "node.h"
class CExactCover
{
public:
CExactCover(const vector
~CExactCover(void);
private:
const CColumnHead* getColumn(int name)const;
const CColumnHead* selectColumn()const; //选择含1个数最少的列
void cover(const CColumnHead *c); //将某一列及其相关的节点从矩阵中删除
void uncover(const CColumnHead *c); //将某一列及其相关的节点重新加入到矩阵中
void CreateHead(const vector
void CreateRows(const vector
bool search(); //求解算法
void print(const vector
CColumnHead* m_master; //列头链表的头节点
};
//文件ExactCover.h
#pragma once
#include
#include
#include
#include
using namespace std;
#include "node.h"
class CExactCover
{
public:
CExactCover(const vector
~CExactCover(void);
private:
const CColumnHead* getColumn(int name)const;
const CColumnHead* selectColumn()const; //选择含1个数最少的列
void cover(const CColumnHead *c); //将某一列及其相关的节点从矩阵中删除
void uncover(const CColumnHead *c); //将某一列及其相关的节点重新加入到矩阵中
void CreateHead(const vector
void CreateRows(const vector
bool search(); //求解算法
void print(const vector
CColumnHead* m_master; //列头链表的头节点
};
[cpp] //文件ExactCover.cpp
#include
#include
#include