您的位置:首页 > 其它

灵光一闪 ~ Diamond

2009-04-01 15:29 288 查看
其实上是我们当时考研复试的上机题目——打印钻石,当时难住了不少人。尽管我做出来了,不过可花了我不少时间。记得当时是采用两层循环来计算,比较麻烦。不过那会儿只求能做出来,哪管得了那么多。

这次一位朋友无意中问到我,我一下子想到一个用自定义零坐标的方法来实现,再加上空间换时间的概念,就成了下面这个小程序。核心代码在7行左右,比当时的少了近2/3。记一下:

#include <iterator>
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

namespace Diamond {
	const int MAXN = 39;
	const int MAXCOL = 2*MAXN + 1;
}

void init(std::vector<char> &vc) {vc.assign(Diamond::MAXCOL, ' ');}

template <typename T>
std::ostream& operator<< (std::ostream& strm, const std::vector<T> &v)
{
	std::vector<T>::const_iterator it;
	for(it = v.begin(); it != v.end(); ++it) strm << *it;
	strm << std::endl;
	return strm;
}

int main(int argc, char* argv[])
{
	std::vector<std::vector<char>> matrix(Diamond::MAXN);
	for_each(matrix.begin(), matrix.end(), init);
	
	int n = 6;
	std::cout << "Please input a integer between (3-" << Diamond::MAXN << "):";
	std::cin >> n;

	if (3 <= n && n <= Diamond::MAXN)
	{
		//whether hollow ?
		char yn = 'y';
		std::cout << "Do u wanna a hollow Diamond? [y,n]";
		std::cin >> yn;
		yn = (yn == 'n' || yn == 'N') ? 'n' : 'y';

		int zero = n-1;
		for (int i = 0; i < n; ++i)
		{//make it out
			if (i>0 && yn == 'n') matrix[i] = matrix[i-1];
			matrix[i][zero+i] = matrix[i][zero-i] = '*';
		}
		//print it out
		int i=0;
		while(i< n)	std::cout << matrix[i++];
		i -= 2;
		while(i>=0)	std::cout << matrix[i--];
	}
	else if (n > Diamond::MAXN)	std::cout << "So large Diamond the screen can't contain it!/n";
	else										std::cout << "Can not make up a Diamond!/n";
	
	return 0;
}




可以选择是否空心。最大为39是因为Console程序一行最多只能是80个字符。



(这是我第4次改这个小程序了,前几次是功能上的,这次是改为用STL代替原来的生数组。一朋友说:你老整它干嘛啊?我觉得真正爱好编程的人是乐意对自己的程序去重构的,只要时间和精力允许。)



程序虽小,但却体现出灵感的重要性。多思考就一定会有灵感!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: