关闭

折纸游戏

296人阅读 评论(0) 收藏 举报
分类:

一张纸对折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');
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:84416次
    • 积分:2976
    • 等级:
    • 排名:第11828名
    • 原创:225篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条