经典算法之图形问题

发布时间 2024-01-05 18:20:02作者: 神奇的萝卜丝

图形问题的万金解决方法就是创建一个二维数组,然后将填数组,最后打印数组就行了。其本质还是找出图形的规律。

首先来找规律,先从外形上来找。

奇数高,看图形,是上下左右对称的。所以只找上半区的规律。

然后首行比其他行少两个字符也就是多两个空格,最外层都是A,数组可以提前都赋值。只需要管中间部分

从中间部分看,是A和B交错的,第0行是A,第1行B主导,第二行A主导,所以是偶数行A主导,奇数行B主导,所以数组可以提前赋值,将A和B都填进去,最后找规律将A和B在不同行插入相应的位置就好了。

偶数行插入B,奇数行插入A。

第一行插入0个A

第三行插入2个A(在 第2列和对称)

第五行插入4个A(在 2 、4)位置

因为奇偶规律一致,所以明显第X行,奇数行要插的位置是 2 ,4 。。。。X-1,然后对称

偶数行就是 1,3,。。。X-1,然后对称。

 最后将上面的元素复制给下面输出就行。

#include <stdio.h>
int main ( ) {
    char c[81][81] = {'\0'} ;
    int n = 0 ;
    char x , y ;
    while ( rewind(stdin) , scanf("%d %c %c",&n,&x,&y ) != EOF ) {
        for ( int i = 0 ; i <  ( n + 1 ) / 2 ; i ++ ) {
            for (int j = 0; j < n; j++) {
                if (i % 2 == 0) {
                    c[i][j] = y ;
                } else {
                    c[i][j] = x ;
                    if( j == 0 || j == n-1 ) {
                        c[i][j]=y ;
                    }
                }
            }
        }
        c[0][0]=' ' ;
        c[0][n-1]=' ' ;
        for (int j = 2 ; j <=  ( n + 1 ) / 2   ; j += 2 ) {
            for ( int i = 1 ; i <= j ; i += 2 ) {
                c[j][i] = x ;
                c[j][n-i] = x ;
            }
        }
        for (int j = 3 ; j <=  ( n + 1 ) / 2 ; j += 2 ) {
            for ( int i = 2 ; i <= j ; i += 2 ) {
                c[j][i] = y ;
                c[j][n-i] = y ;
            }
        }
        for( int i = 0 ; i < ( n + 1 ) / 2 ; i ++ ) {
            for( int j = 0 ; j < n ; j ++ ) {
                c[n - 1 - i][j] = c[i][j];
            }
        }
        
        for( int i = 0 ; i <=  n  ; i ++ ) {
            printf("%s\n", c[i] ) ;
        }
   }
    return 0 ;
}

运行结果: