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

如何将文本格式外星人图案的二维数组旋转180度?

180度旋转字符图案问题

原始图案

o            o 
  '          '  
   '        '   
    :-'""'-:    
 .-'  ____  '-. 
( (  (_()_)  ) )
 '-.   ^^  .-'  
    '._==_.'    
    ___)(___    

问题描述

我将上述图案存储在文本文件中,已加载到二维数组,但无法实现180度旋转。尝试了以下函数,没有效果:

尝试的代码

void rotateImage(char alien[ROWS][COLS]){

    char temp; 

    for(int r = 0; r < ROWS; r++){
        for(int c = 0; c < COLS; c++){
            temp = alien[r][c];
            alien[r][c] = alien[r][COLS-1-c];
            alien[r][COLS-1-c] = temp;
            printf("%c", alien[r][COLS-1-c]);
        }
    
        printf("\n");
    }
}

问题分析

当前代码存在两个关键问题:

  • 每行遍历所有列会导致元素被交换两次(比如c=0和c=COLS-1交换后,到c=COLS-1时又交换回来),等于没做任何翻转。
  • 代码仅尝试水平翻转每行,但180度旋转需要同时完成水平翻转+垂直翻转,本质是将元素和其对角对称位置的元素交换。

正确实现方案

方法一:按行对称交换

void rotate180(char alien[ROWS][COLS]){
    char temp;
    // 交换上下对称行的元素
    for(int r = 0; r < ROWS / 2; r++){
        for(int c = 0; c < COLS; c++){
            temp = alien[r][c];
            alien[r][c] = alien[ROWS - 1 - r][COLS - 1 - c];
            alien[ROWS - 1 - r][COLS - 1 - c] = temp;
        }
    }
    // 处理奇数行数的中间行,单独水平翻转
    if(ROWS % 2 != 0){
        int midRow = ROWS / 2;
        for(int c = 0; c < COLS / 2; c++){
            temp = alien[midRow][c];
            alien[midRow][c] = alien[midRow][COLS - 1 - c];
            alien[midRow][COLS - 1 - c] = temp;
        }
    }

    // 打印旋转后的图案
    for(int r = 0; r < ROWS; r++){
        for(int c = 0; c < COLS; c++){
            printf("%c", alien[r][c]);
        }
        printf("\n");
    }
}

方法二:按总元素数对称交换

更简洁的写法,直接遍历前半部分元素,和后半部分对称位置交换:

void rotate180(char alien[ROWS][COLS]){
    char temp;
    int totalElements = ROWS * COLS;
    for(int i = 0; i < totalElements / 2; i++){
        int r1 = i / COLS;
        int c1 = i % COLS;
        int r2 = (totalElements - 1 - i) / COLS;
        int c2 = (totalElements - 1 - i) % COLS;
        temp = alien[r1][c1];
        alien[r1][c1] = alien[r2][c2];
        alien[r2][c2] = temp;
    }

    // 打印结果
    for(int r = 0; r < ROWS; r++){
        printf("%s\n", alien[r]);
    }
}

原理说明

180度旋转的核心是:原数组中位置(r, c)的元素,会被位置(ROWS-1-r, COLS-1-c)的元素替换。两种方法都基于这个对称关系,确保每个元素只交换一次,避免重复操作导致图案还原。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:24:52