打印一个“回”字图形
来源:互联网 发布:appletv如何安装软件 编辑:程序博客网 时间:2024/04/18 11:49
在c#板块里看到一个帖子关于打印“回”字图形,觉得蛮有趣,就自己动手写写。/
要求输入:
1
-------
222
212
222
-------
33333
32223
32123
32223
33333
-------
4444444
4333334
4322234
4321234
4322234
4333334
4444444
-------
555555555
544444445
543333345
543222345
543212345
543222345
543333345
544444445
555555555
-------
66666666666
65555555556
65444444456
65433333456
65432223456
65432123456
65432223456
65433333456
65444444456
65555555556
66666666666
-------
7777777777777
7666666666667
7655555555567
7654444444567
7654333334567
7654322234567
7654321234567
7654322234567
7654333334567
7654444444567
7655555555567
7666666666667
7777777777777
-------
888888888888888
877777777777778
876666666666678
876555555555678
876544444445678
876543333345678
876543222345678
876543212345678
876543222345678
876543333345678
876544444445678
876555555555678
876666666666678
877777777777778
888888888888888
-------
99999999999999999
98888888888888889
98777777777777789
98766666666666789
98765555555556789
98765444444456789
98765433333456789
98765432223456789
98765432123456789
98765432223456789
98765433333456789
98765444444456789
98765555555556789
98766666666666789
98777777777777789
98888888888888889
99999999999999999
-------
对于图形输出的题目,找到其中规律后应该就ok了。但是要找到比较简练的就不易。像我这编程过少的,想思路就比较老土。不过还好最终搞定了:找每行的规律后逐行输出。Sigh..还是得多练!
- void PrintBox(int n)
- {
- for(int nn = 1; nn <= n; nn++)
- {
- for(int i = 1; i <= 2 * (nn - 1) + 1; i++)
- {
- int m = i > nn ? 2 * nn - i:i;//以第n行为准,对称.
- int j = nn - m + 1;
- for(int k = nn; k > j; k--)
- cout<<k;//每行的递减部分
- for(int k = 1; k <= 2 * (j - 1) + 1; k++)
- cout<<j;//每行的相等部分,输出每个数的第一行 都为2 * (j - 1) + 1次
- for(int k = j + 1; k <= nn; k++)
- cout<<k;//每行的递增部分
- cout<<endl;
- }
- cout<<"-------------------------"<<endl;
- }
- }
之后回论坛看回复,发现其实//a(i,j)=max(|n-i|,|n-j|)+1, Shit...so easy...
- void PrintBox_2(int n)
- {//a(i,j)=max(|n-i|,|n-j|)+1
- for(int i = 1; i <= n; i++)
- {
- int m = 2 * n - 1;
- for(int j = 1; j <= m; j++)
- {
- for(int k = 1; k <= m; k++)
- cout<<max(abs(n - j),abs(n - k)) + 1;
- cout<<endl;
- }
- cout<<"-----------------";
- }
- }
下面是用递归解,思路比较简单,清晰。
- #define MAX 20
- #include<iostream>
- using namespace std;
- int out[MAX][MAX];
- void Init(int data, int start, int end)
- {//递归,从外层往内层递归。
- //填充+覆盖
- for (int i = start; i < end; i++)
- for (int j = start; j < end; j++)
- out[i][j] = data;
- if (data > 1) Init(data-1, start+1, end-1);
- }
- int main()
- {
- for(int sz = 1; sz != 10; sz++)
- {
- Init(sz, 0, sz*2-1);
- for (int i = 0; i < 2*sz - 1; i++)
- {
- for (int j = 0; j < 2*sz - 1; j++)
- cout<<out[i][j];
- cout<<endl;
- }
- cout<<"========================="<<endl;
- }
- return 0;
- }
refer to : http://topic.csdn.net/u/20080824/19/b4790925-f856-40bd-ac57-e29be3a9804c.html?seed=390049095