折纸游戏

一张纸对折n次,凹痕为0,凸痕为1,求对折n次对应的01串

方法1 生成满二叉树法

string fold(int n) {
	if (n <= 0) return "";
	struct TreeNode {
		char val;
		TreeNode * left;
		TreeNode * right;
		TreeNode(char c) :val(c), left(nullptr), right(nullptr) {}
	};
	function<void(TreeNode*, string&)> inOrder = [&](TreeNode* root, string &s) {
		if (!root) return;
		inOrder(root->left, s);
		s.push_back(root->val);
		inOrder(root->right, s);
	};
	queue<TreeNode*> q;
	auto root = new TreeNode('0');
	q.push(root);
	for (int i = 1; i < n; ++i) {
		for (int j = 0, sz = q.size(); j < sz; ++j) {
			auto node = q.front(); q.pop();
			node->left = new TreeNode('0');
			node->right = new TreeNode('1');
			q.push(node->left);
			q.push(node->right);
		}
	}
	string s;
	inOrder(root, s);
	return s;
}

方法2:直接生成

void help(string &s, int l, int r, char c) {
	if (l > r) return;
	int m = l + ((r - l) >> 1);
	s[m] = c;
	help(s, l, m - 1, '0');
	help(s, m + 1, r, '1');
}
string fold(int n) {
	if (n < 1) return "";
	int m = pow(2, n) - 1;
	string s(m, 'a');
	help(s, 0, s.size() - 1, '0');
	return s;
}

方法3:流式输出

递归函数定义:折n次,第一次是c痕(0为凹痕,1为凸痕)的所有折痕

string s;
void fold(int n, char c) {
	if (n < 1) return;
	fold(n - 1, '0');
	s.push_back(c);
	fold(n - 1, '1');
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值