打印十字图
打印十字图
图形摸样:
1.此题没有什么算法思想,纯粹是找规律,很明显这是一个对称图形,我们先可以分成4个部分(左上,右上,左下,右下)
规律:行列都是(n * 4 + 5)
2.所以我们只需要考虑左上即可
只考虑的部分:
1. 2.
3. 4.
i为行,j为列
- 不管图形多大,左上角4个一定是点(i <= 2 && j <= 2)
- 再对此时的图形做对称,可以将右上的全部翻转到左下
- 当为奇数行时,由图看出,行列差2即可(i % 2 == 1 && j >= i - 2)
- 当为奇数列时,不能有(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 }