九度OJ 1171:C翻转 (矩阵计算)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4649

解决:1530

题目描述:

首先输入一个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
来源:
2010年北京邮电大学计算机研究生机试真题

思路:

总体思路是每次旋转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\n", i, j);
        for(i=0; i<M; i++)
        {
            for(j=0; j<M; j++)
            {
                if (j != 0)
                    printf(" ");
                printf("%d", b[i][j]);
            }
            printf("\n");
        }
    }
 
    return 0;
}
/**************************************************************
    Problem: 1171
    User: liangrx06
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:912 kb
****************************************************************/


posted on 2015-10-26 09:54  梁山伯  阅读(187)  评论(0编辑  收藏  举报

导航