Tuesday, December 18, 2018

算法题-接龙循环移位


题目描述

编写函数
void shift_solit_matrix(int m, int n, int *matrix, int number);
将 m × n 维的矩阵进行一条龙循环移位。移位过程中,矩阵的相邻行相接,构成 “一条龙”(第一行与第二行尾相连,第二行与第三行首相连,依此类推)。使用指针方法编程。
输入形式为:
m(行数 0 < m < 100)
n(列数 0 < n < 100)
matrix 矩阵元素 m 行 n 列(同一行的元素以空格隔开)
number(位移大小,负数表示向左循环移位,正数表示向右循环移位)
输出移位后的矩阵。若输入m,n不符合要求,则输出 “ERROR”。

输入

共 m+3 行:
m(行数 0 < m < 100)
n(列数 0 < n < 100)
matrix 矩阵元素 m 行 n 列(同一行的元素以空格隔开)
number(位移大小,负数表示向左循环移位,正数表示向右循环移位)

输出

移位后的矩阵。若输入m,n不符合要求,则输出 “ERROR”。

样例输入

3
3
1 2 3
4 5 6
7 8 9
1

样例输出

9 1 2
5 6 3
4 7 8

我的代码


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>

void reverse(int *p, int len) {
    int *begin = p;
    int *end = p + len - 1;

    while (begin < end) {
        int t = *begin;
        *begin = *end;
        *end = t;

        begin++;
        end--;
    }
}

int main() {
    int data[30000];
    int m, n, k, *p = data+10000, p_idx = 0;
    scanf("%d%d", &m, &n);

    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j, p_idx++) {
            int r = scanf("%d", p+p_idx);
            if (r == EOF) {
                printf("ERROR");
                return 0;
            }
        }
        if (i % 2) {
            reverse(p+(i*n), n);
        }
    }
    scanf("%d", &k);
    k %= (m * n);

    memcpy(p - (m*n), p, m*n*sizeof(int));
    memcpy(p + (m*n), p, m*n*sizeof(int));

    /*
    for (int i = 0; i < 3*n*m; i++) {
        printf("%d ", (p - (m*n))[i]);
    }

    printf("\n");
    */

    p -= k;
    p_idx = 0;

    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j, p_idx++) {
            if (j)
                printf(" ");

            if (i % 2)
                printf("%d", p[n*(i+1) - j - 1]);
            else
                printf("%d", p[p_idx]);
        }
        printf("\n");
    }






    return 0;
}

// vim: et:ts=4:sw=4:

0 comments:

Post a Comment