c++ 舞蹈链算法求解数独问题 控制台版本 带注释

本文详细介绍了使用C++编程语言结合舞蹈链算法来解决经典的数独问题。通过控制台实现,代码中包含清晰的注释,便于理解和学习。舞蹈链算法在数独求解中的应用展示了其在遍历和搜索解决方案上的效率。

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

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#define DELPOINTER(p) if(nullptr!=(p)){delete[] (p),(p)=nullptr;}
#define DO(sth) for (DLXNode * pCol = pRow->right; pCol != pRow; pCol = pCol->right) {\
	(sth)(pCol->elem.c);\
}

using namespace std;

int ans[1000];

unordered_map<int, int> m;

struct ElemType {
	int r, c;
	ElemType(const int & _r = int(), const int & _c = int()) :r(_r), c(_c) {}
};

struct DLXNode {
	ElemType elem;
	DLXNode *up, *left, *down, *right;
	DLXNode(const ElemType & _elem = ElemType(),
		DLXNode * _up = nullptr, DLXNode * _left = nullptr, DLXNode * _down = nullptr, DLXNode * _right = nullptr)
		:elem(_elem), up(_up), left(_left), down(_down), right(_right) {}
};

class DLX {
public:
	DLX(const int & _row, const int & _col);
	DLX(const vector<vector<int> > & mtx);
	~DLX(void);

	inline void addNode(const int & x, const int & y);
	/* 双向链表的断开与连接操作 */
	/* U  L  D  R */
	/* 上 左 下 右 */
	inline void deleteUD(DLXNode * p);
	inline void deleteLR(DLXNode * p);
	inline void resumeUD(DLXNode * p);
	inline void resumeLR(DLXNode * p);

	void cover(const int & col);
	void uncover(const int & col);

	bool dance(const int & step);

	inline DLXNode* getNode(const int & index);
private:
	void init(const int & row, const int & col);
	inline bool empty() { return m_pHead->left == m_pHead; }
	inline int getMinColPos();	// 获取当前所有列中元素个数最小的一列

private:
	int m_nIndex;	// 有多少个节点
	int m_nRowCount;	// 行数
	int m_nColCount;	// 列数
	int * m_pS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值