打印十字图

打印十字图

 

图形摸样:

         

 

1.此题没有什么算法思想,纯粹是找规律,很明显这是一个对称图形,我们先可以分成4个部分(左上,右上,左下,右下)

规律:行列都是(n * 4 + 5)

2.所以我们只需要考虑左上即可

只考虑的部分:

      1.     2.   

     3.    4.  

 

  

    i为行,j为列

  1. 不管图形多大,左上角4个一定是点(i <= 2 && j <= 2)
  2. 再对此时的图形做对称,可以将右上的全部翻转到左下
  3. 当为奇数行时,由图看出,行列差2即可(i % 2 == 1 && j >= i - 2)
  4. 当为奇数列时,不能有(2,1)(4,3)故规律为(j % 2 == 1 && j != i - 1)

 

代码:

 1 #include <stdio.h>
 2 void swap(int *a, int *b)
 3 {
 4     int temp;
 5     temp = *a;
 6     *a = *b;
 7     *b = temp;
 8 }
 9 
10 int go(int i, int j, int n)
11 {
12     if (i > n * 2 + 3)//上下对称
13         i = n * 4 + 6 - i;
14     if (j > n * 2 + 3)//左右对称
15         j = n * 4 + 6 - j;
16     if (i < j)
17         swap(&i, &j);
18     if (i <= 2 && j <= 2) //四个小角
19         return 0;
20     if (i % 2 == 1 && j >= i - 2)//核心规律
21         return 1;
22     if (j % 2 == 1 && j != i - 1)//核心规律
23         return 1;
24     return 0;
25 }
26 
27 int main()
28 {
29     int n;
30     scanf("%d", &n);
31 
32     int i, j;
33     for (i = 1; i <= n * 4 + 5; i++)
34     {
35         for (j = 1; j <= n * 4 + 5; j++)
36         {
37             if (go(i, j, n))
38                 printf("$");
39             else
40                 printf(".");
41         }
42         printf("\n");
43     }
44 
45     return 0;
46 }
posted @ 2019-03-16 10:10  Diligent_Memory  阅读(360)  评论(0编辑  收藏  举报