打印一个“回”字图形

来源:互联网 发布: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..还是得多练!   

 

  1. void PrintBox(int n)
  2. {
  3.     for(int nn = 1; nn <= n; nn++)
  4.     {
  5.         for(int i = 1; i <= 2 * (nn - 1) + 1; i++)
  6.         {
  7.             int m = i > nn ? 2 * nn - i:i;//以第n行为准,对称.
  8.             int j = nn - m + 1;
  9.             for(int k = nn; k > j; k--)
  10.                 cout<<k;//每行的递减部分
  11.             for(int k = 1; k <= 2 * (j - 1) + 1; k++)
  12.                 cout<<j;//每行的相等部分,输出每个数的第一行 都为2 * (j - 1) + 1次
  13.             for(int k = j + 1; k <= nn; k++)
  14.                 cout<<k;//每行的递增部分
  15.             cout<<endl;
  16.         }
  17.         cout<<"-------------------------"<<endl;
  18.     }
  19. }

       之后回论坛看回复,发现其实//a(i,j)=max(|n-i|,|n-j|)+1, Shit...so easy...

  1. void PrintBox_2(int n)
  2. {//a(i,j)=max(|n-i|,|n-j|)+1
  3.     for(int i = 1; i <= n; i++)
  4.     {
  5.         int m = 2 * n - 1;
  6.         for(int j = 1; j <= m; j++)
  7.         {
  8.             for(int k = 1; k <= m; k++)
  9.                 cout<<max(abs(n - j),abs(n - k)) + 1;
  10.             cout<<endl;
  11.         }
  12.         cout<<"-----------------";
  13.     }   
  14. }

下面是用递归解,思路比较简单,清晰。

  1. #define MAX 20
  2. #include<iostream>
  3. using namespace std;
  4. int out[MAX][MAX];
  5. void Init(int data, int start, int end)
  6. {//递归,从外层往内层递归。
  7. //填充+覆盖
  8.   for (int i = start; i < end; i++)
  9.     for (int j = start; j < end; j++)
  10.        out[i][j] = data;
  11.   if (data > 1) Init(data-1, start+1, end-1);
  12. }
  13. int main()
  14. {
  15.     for(int sz = 1; sz != 10; sz++) 
  16.     {
  17.         Init(sz, 0, sz*2-1);
  18.         for (int i = 0; i < 2*sz - 1; i++)
  19.         {
  20.             for (int j = 0; j < 2*sz - 1; j++)
  21.               cout<<out[i][j];
  22.             cout<<endl;
  23.         }
  24.         cout<<"========================="<<endl;
  25.     }
  26.     return 0;
  27. }

refer to : http://topic.csdn.net/u/20080824/19/b4790925-f856-40bd-ac57-e29be3a9804c.html?seed=390049095

原创粉丝点击