- 题目描述:
-
首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。
操作类型有四种:
1 2 表示:90度,顺时针,翻转4个数
1 3 表示:90度,顺时针,翻转9个数
2 2 表示:90度,逆时针,翻转4个数
2 3 表示:90度,逆时针,翻转9个数
- 输入:
-
输入有多组数据。
每组输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。
- 输出:
-
输出翻转后的数组。
- 样例输入:
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 3 1 1
- 样例输出:
-
11 6 1 4 5 12 7 2 9 10 13 8 3 14 15 16 17 18 19 20 21 22 23 24 25
思路:
总体思路是每次旋转90度,超过就多次旋转。可能犯错的细节较多,多调试。
代码:
#include <stdio.h> #define M 5 struct point { int i; int j; }; struct point rotate(int n, int i, int j, int x, int y, int degree) { struct point p; p.i = i; p.j = j; int tmp; for (int k=1; k<=degree/90; k++) { tmp = p.i; p.i = (x-y) + p.j; p.j = (x-1) + (y-1) + n-1 - tmp; } return p; } int main(void) { int i, j; int d, n, x, y; int a[M][M], b[M][M]; struct point p; int degree; while (scanf("%d", &a[0][0]) != EOF) { for(i=0; i<M; i++) { for(j=0; j<M; j++) { if (i == 0 && j == 0) continue; scanf("%d", &a[i][j]); } } scanf("%d%d%d%d", &d, &n, &x, &y); if (d == 1) degree = 90; else degree = 270; for(i=0; i<M; i++) { for(j=0; j<M; j++) { if (i<x-1 || i>=x-1+n || j<y-1 || j>=y-1+n) b[i][j] = a[i][j]; else { p = rotate(n, i, j, x, y, degree); b[p.i][p.j] = a[i][j]; } } } //printf("i=%d, j=%d ", i, j); for(i=0; i<M; i++) { for(j=0; j<M; j++) { if (j != 0) printf(" "); printf("%d", b[i][j]); } printf(" "); } } return 0; } /************************************************************** Problem: 1171 User: liangrx06 Language: C Result: Accepted Time:0 ms Memory:912 kb ****************************************************************/