美文网首页
蓝桥杯 打印十字圈

蓝桥杯 打印十字圈

作者: Draper | 来源:发表于2017-02-08 17:23 被阅读0次
    蓝桥杯 打印十字圈

    以上就是题目

    根据那个坑爹提示,曾以为还要计算很多公式
    只要把题解出来就可以嘛(也许推出公式之类的更快一些吧...)

    我的思路算是把暴力推演到了极致
    大致的思路在注释里

    #include
    #include
    /*
        13  6
        9   4
        5   
        
        ..$$$$$..
        ..$...$..
        $$$.$.$$$
        $...$...$
        $.$$$$$.$
        $...$...$
        $$$.$.$$$
        ..$...$..
        ..$$$$$..
    */ 
    
    void init_array(char array[135][135], char c)
    {
        for(int i; i < 135; i++)
        {
            for(int j = 0; j < 135; j++)
            {
                array[i][j] = c;
            }
        }
    }
    
    //数组 arr 第 i 行 j 列赋值 num 个 c 
    void row_char(char arr[135][135], int row, int column, int num, char c)
    {
        for(int i = 0; i < num; i++, column++)
        {
            arr[row][column] = c;
        }
    }
    
    void column_char(char arr[135][135], int row, int column, int num,char c)
    {
        for(int i = 0; i < num; i++, row++)
        {
            arr[row][column] = c;
        }
    }
    
    //初始化画板 
    void init_canvas(char canvas[135][135], int row, int column)
    {
        int mid = row / 2;
        row_char(canvas, mid, mid - 2, 5, '$');
        column_char(canvas, mid - 2, mid, 5, '$');
        
    }
    
    int check_around(char arr[135][135], int row, int column, int ri, int cj, char c)
    {
        int flag = 0;
        for(int i = -1; i <= 1; i++)
        {
            for(int j = -1; j <= 1; j++)
            {
                if(ri + i < 0 || ri + i > row || cj + j < 0 || cj + j > column)
                {
                    continue;
                }
                
                if(arr[ri + i][cj + j] == c)
                {
                    flag++;
                    return flag;
                }
            }
        }
        return 0;
    }
    
    // 
    void scan_char(char arr[135][135], int row, int column, char check,char fu)
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < column; j++)
            { 
                if(arr[i][j] == ' ' && check_around(arr, row, column, i, j, check))
                {
                    arr[i][j] = fu;
                }
            }
        }   
    }
    
    void end(char arr[135][135], int row, int column)
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < column; j++)
            {
                if(arr[i][j] == ' ')
                {
                    arr[i][j] = '.';
                }
            }
        }
    }
    
    void printf_list(char arr[135][135], int row, int column)
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < column; j++)
            {
                printf("%c", arr[j][i]);
            }
            printf("\n");
        }
    }
    
    int main()
    {
        char canvas[135][135];//画布
        int row = 5, column = 5, danwei = 4;
        int ceng = 0; 
        int flag = 0;//0 代表. 1 代表 $ 
        
        //初始化字符串
        init_array(canvas, ' ');
        
        //输入层数, 计算实际画布大小 
        scanf("%d", &ceng);
        row = row + ceng * danwei;
        column = column + ceng * danwei;
        
        //在画布中间画一个十字 
        init_canvas(canvas, row, column);
        
        //开始一圈一圈从中间赋值 
        for(int i = 0; i < ceng * 2; i++, flag = !flag)
        {
            //check 代表检查的字符, fu 代表要赋值的字符 
            char check, fu;
            if(flag == 0)
            {
                check = '$', fu = '.';
                scan_char(canvas, row, column, check, fu);
            } else {
                check = '.', fu = '$';
                scan_char(canvas, row, column, check, fu);
            }       
        }
        
        //最后一步将数组中所有的空格字符赋值为 '.' 
        end(canvas, row, column);   
        
        printf_list(canvas, row, column);
        
        //大功告成 
        return 0;
    }
    

    看着这暴力的代码有点汗颜...

    相关文章

      网友评论

          本文标题:蓝桥杯 打印十字圈

          本文链接:https://www.haomeiwen.com/subject/vkcbittx.html