牛客网之“折纸问题”

匿名 (未验证) 提交于 2019-12-03 00:26:01

昨天在看左程云数据结构视频时遇到一道折纸问题,当时比较感兴趣,并对问题进行分析提取关键点进而通过代码实现。 内容分为:题目描述、问题分析、解决问题和代码描述四大部分。

题目描述

折纸问题

简要说:将纸条从下往上对折N次,由上往下产生的折痕方向序列。

问题分析

对问题进行步骤分析如下:

1. 首先,要对问题进行详细剖析的前提是拿张纸对折几次并从中发现规律。

2. 其次就是进行试验,发现对折1次时折痕为1方向为down,对折2次时折痕为3方向为down down up,对折3次时折痕为7方向为down down up down down up up,对折4次时折痕为15方向为down down up down down up up down down down up up down up up。

3. 最后从结果中找出规律,完成编码。

解决问题

在这里给张图就可以清晰的把问题解决掉。


从结果中分析:第一次折纸后方向为down,第二次折纸后围绕第一次结果从上往下增加了down和up,第三次结果围绕第二次结果(不包括第一次)每个折痕多了down和up。假定我们猜想,通过实验分析和验证第四次结果正确性。明显结果正确,猜想成立。

代码描述

直接上代码:

/* 	折纸问题 	【题目】 请把一段纸条竖着放在桌子上,然后从纸条的下边向 	上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕 	突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折 	2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折 	痕、下折痕和上折痕。 	给定一 个输入参数N,代表纸条都从下边向上方连续对折N次, 	请从上到下打印所有折痕的方向。 例如:N=1时,打印: down 	N=2时,打印: down down up */ #include <iostream> #include <vector> #include <string> #include <iomanip> using namespace std;  vector<string> origima_problem(int N);  int main(void) { 	int N = 0; 	while (cin >> N) { 		vector<string> result = origima_problem(N);  		cout << "折纸状况(共" << result.size() << ")次:" << endl; 		vector<string>::iterator it; 		for (it = result.begin(); it != result.end(); ++it) { 			cout << setw(5) << *it; 		} 		cout << endl; 	} } vector<string> origima_problem(int N) { 	vector<string> result, tmp; 	string down = "down", up = "up"; 	for (int i = 1; i <= N; ++i) { 		tmp.erase(tmp.begin(), tmp.end()); 		if (i <= 1) { 			result.push_back("down"); 			continue; 		} 		for (int i = 0; i < result.size(); ++i) { 			if (i % 2 != 0) { 				tmp.push_back(result[i]); 			} 			else { 				tmp.push_back(down); 				tmp.push_back(result[i]); 				tmp.push_back(up); 			} 		} 		result.swap(tmp); 	} 	return result; }

从代码中,我们可以看出规避了上上一个折痕。这样就达到了预期设想的结果。

思考:如果对折方向发生变化,多个方向会怎么样。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!