数组环形扫描

来源:互联网 发布:软件汉化 编辑:程序博客网 时间:2024/05/16 13:50

在每次扫描结束的时候,更新当前矩形的边际即可

#include <stdio.h>#include <stdlib.h>#include <assert.h>int * newIntRaw(int n){    return (int *)malloc(sizeof(int) * n);}int ** newMap(int n, int m){    int i;    int **res = (int **)malloc(sizeof(int *) * n);    for (i = 0; i < n; ++i)        res[i] = newIntRaw(m);    return res;}// ------------solve----------int **map;int n, m;int left = 0, right = 0, up = 0, down = 0;void solve(){    int i;    while (1) {        if (left > right || up > down)            break;        for (i = up; i <= down; ++i) {            printf("%d ", map[i][left]);        }        left++;        if (left > right || up > down)            break;        for (i = left; i <= right; ++i) {            printf("%d ", map[down][i]);        }        down--;        if (left > right || up > down)            break;        for (i = down; i >= up; --i) {            printf("%d ", map[i][right]);        }        right--;        if (left > right || up > down)            break;        for (i = right; i >= left; --i) {            printf("%d ", map[up][i]);        }        up++;    }}int main(){    int i, j;    // init    scanf("%d %d", &n, &m);    map = newMap(n, m);    for (i = 0; i < n; i++) {        for (j = 0; j < m; ++j) {            scanf("%d", &map[i][j]);        }    }    left = 0, right = m - 1, up = 0, down = n - 1;    solve();    return 0;}/*5 51 16 15 14 132 17 24 23 123 18 25 22 124 19 29 21 105 6 7 8 9*/