You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:二维数组中从指定位置按距离绘制字符问题求助

二维数组中心图案绘制的C代码问题排查

需求说明

在二维数组中以指定位置为中心实现绘制效果:

  • 在矩阵的(7,7)位置放置字符'A'作为中心
  • 中心行(第7行)向左右各绘制4个'x'
  • 向上每移动一行,左右绘制的'x'数量各减少1个
  • 向下每移动一行,左右绘制的'x'数量各减少1个

现有代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 用于abs函数

char matrix[14][22];
int i,j,ran;
int range = 4;
int posx = 7;
int posy = 7;

void draw_range(void){
    for (ran=range;ran>=0;ran--){
        /* drawing range to the right side */
        /* up */
        for(i=0;i<=ran;i++) {
            if (matrix[posy-i][posx+range-ran] == '.'){
                matrix[posy-i][posx+range-ran] = 'x';
            }
            /* down */
            if (matrix[posy-i+ran][posx-ran+range] == '.'){
                matrix[posy-i+ran][posx-ran+range] = 'x';
            }
        }
    }
    /* drawing range to the left side */
    for (ran=0;ran<range;ran++){
        /* down */
        for(i=range;i>0;i--){
                if (matrix[posy+ran][posx-i+ran] == '.'){
                    matrix[posy+ran][posx-i+ran] = 'x';
                }
                /* up */
                if (matrix[posy-ran][posx-i+ran] == '.'){
                    matrix[posy-ran][posx-i+ran] = 'x';
                }
            }
        }
}

int main (int argc, char *argv[]){
    // 用点填充数组
    for (i=0;i<14;i++) {
        for (j=0;j<22;j++) {
            matrix[i][j] = '.';
        }
    }

    // 放置中心字符'A'
    matrix[posy][posx] = 'A';

    draw_range();

    // 打印数组
    for (i=0;i<14;i++) {
        for (j=0;j<22;j++) {
            printf("%c",matrix[i][j]);
        }
        printf("\n");
    }
}

编译命令

gcc main.c -o main

期望输出

......................
......................
......................
.......x..............
......xxx.............
.....xxxxx............
....xxxxxxx...........
...xxxxAxxxx..........
....xxxxxxx...........
.....xxxxx............
......xxx.............
.......x..............
......................
......................

实际输出

......................
......................
......................
.......x..............
......xxxx............
.....xxxxx............
....xxxxxxx...........
...xxxxAxxxx..........
....xxxxxxx...........
.....xxxxx............
......xxxx............
.......x..............
......................
......................

问题分析与修复

原draw_range函数的循环逻辑过于复杂,导致部分位置重复绘制了额外的'x'(比如第5行和第11行多了一个x)。可以换一种更直观的实现思路:

  1. 遍历中心上下的每一行,计算当前行与中心行的距离d
  2. 根据距离d,确定当前行需要绘制'x'的左右边界:左边界为posx - (range - d),右边界为posx + (range - d)
  3. 在左右边界范围内填充'x',跳过中心位置的'A'

修复后的draw_range函数:

void draw_range(void){
    int y, x, d;
    // 遍历中心上下的所有行
    for(y = posy - range; y <= posy + range; y++){
        // 计算当前行到中心行的距离
        d = abs(y - posy);
        // 当前行需要绘制的x范围:左右各(range - d)个
        int left = posx - (range - d);
        int right = posx + (range - d);
        
        // 填充该行的x
        for(x = left; x <= right; x++){
            // 跳过中心的'A'
            if(y == posy && x == posx){
                continue;
            }
            matrix[y][x] = 'x';
        }
    }
}

替换原函数后,编译运行即可得到符合预期的输出。

内容的提问来源于stack exchange,提问作者louis5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:37:16