7-269 旋转方阵
分数 10
作者 黄龙军
单位 绍兴文理学院
对于一个奇数n阶方阵,请给出经过顺时针方向m次旋转后的结果。
输入格式:
测试数据有多组,处理到文件尾。每组测试的第一行输入2个整数n,m(1<n<20,1≤m≤100),接下来输入n行数据,每行n个整数。
输出格式:
对于每组测试,输出奇数阶方阵经过m次顺时针方向旋转后的结果。每行中各数据之间留一个空格。
输入样例:
3 2
4 9 2
3 5 7
8 1 6
3 1
4 9 2
3 5 7
8 1 6
3 7
4 9 2
3 5 7
8 1 6
3 8
4 9 2
3 5 7
8 1 6
输出样例:
6 1 8
7 5 3
2 9 4
8 3 4
1 5 9
6 7 2
2 7 6
9 5 1
4 3 8
4 9 2
3 5 7
8 1 6
#include <stdio.h>
int main(){
int n, m;
int count = 0;
while(~scanf("%d %d", &n, &m)){ //处理到文件尾
int arr[n][n];
int _arr[n][n];
for(int i = 0; i < n; i++){ //遍历数组
for(int j = 0; j < n; j++){
scanf("%d", &arr[i][j]);
}
}
count = m % 4; //旋转次数
for(int p = 1; p <= count; p++){ //旋转次数
// 顺时针旋转
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
_arr[i][j] = arr[n-1-j][i];
}
}
//将旋转后的数据赋值以便再次旋转
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
arr[i][j] = _arr[i][j];
}
}
}
//输出数组
for(int i = 0; i < n; i++){ //输出行
for(int j = 0; j < n; j++){ //输出列
if(j == n-1)
printf("%d\n", arr[i][j]); //输出的每行结束不空格且换行
else
printf("%d ", arr[i][j]);
}
}
}
return 0;
}
解题思路:
step1:找出其中的位置变化规律(方阵顺时针旋转90°时,每行的列号不变并向下逐次递增;每行的行号从左到右递减)
step2:用另一个辅助数组来储存将其顺时针旋转后的数据
step3:再将辅助数组的数据赋值给原来的数组(以便进行下一次旋转)
step4:输出数组即可
注:输出格式
归属知识点:
数组
循环结构