如何将文本格式外星人图案的二维数组旋转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
相关产品推荐
相关产品推荐

