10 条题解
-
3
按题意模拟。再建造一个二维数组 ,用于存操作完的 数组。操作完后进入
print()
函数,输出 数组,再将 数组更新。操作:
- 平移:操作时,从第一行开始存从第二行开始的数,最后补上未存的数。操作类似。
- 旋转:观察样例:
转完后:1 2 3 4 5 6 7 8 9
可以发现,只是存的时候先存列,再将行倒过来 其余同理。7 4 1 8 5 2 9 6 3
:
#include <bits/stdc++.h> using namespace std; int n,q,a[101][101],num,b[101][101]; void print()//输出并且更新a { for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { a[i][j] = b[i][j]; printf("%d ",a[i][j]); } printf("\n"); } printf("\n"); return; } signed main() { scanf("%d%d",&n,&q); for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { scanf("%d",&a[i][j]); } } for(int x = 1;x <= q;x++) { scanf("%d",&num); if(num == 1) { for(int i = 2,o = 1;i <= n;i++,o++)//b从第一行开始存a从第二行开始的数 { for(int j = 1;j <= n;j++) { b[o][j] = a[i][j]; } } for(int i = 1;i <= n;i++) b[n][i] = a[1][i];//补上未赋值的 print();//输出 } else if(num == 2)//同上 { for(int i = 2,o = 1;i <= n;i++,o++) { for(int j = 1;j <= n;j++) { b[i][j] = a[o][j]; } } for(int i = 1;i <= n;i++) b[1][i] = a[n][i]; print(); } else if(num == 3)//同上 { for(int i = 1;i <= n;i++) { for(int j = 2,o = 1;j <= n;j++,o++) { b[i][o] = a[i][j]; } } for(int i = 1;i <= n;i++) b[i][n] = a[i][1]; print(); } else if(num == 4)//同上 { for(int i = 1;i <= n;i++) { for(int j = 2,o = 1;j <= n;j++,o++) { b[i][j] = a[i][o]; } } for(int i = 1;i <= n;i++) b[i][1] = a[i][n]; print(); } else if(num == 5) { for(int j = 1;j <= n;j++) { for(int i = 1,o = n;i <= n;i++,o--) { b[j][i] = a[o][j]; } } print(); } else if(num == 6) { for(int i = n,o = 1;i >= 1;i--,o++) { for(int j = n,t = 1;j >= 1;j--,t++) { b[o][t] = a[i][j]; } } print(); } else if(num == 7) { for(int j = n,o = 1;j >= 1;j--,o++) { for(int i = 1;i <= n;i++) { b[o][i] = a[i][j]; } } print(); } } return 0; }
因本人很赖所以没有写出所有情况的解释
信息
- ID
- 2956
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 649
- 已通过
- 166
- 上传者