在每次扫描结束的时候,更新当前矩形的边际即可
#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 5
1 16 15 14 13
2 17 24 23 12
3 18 25 22 12
4 19 29 21 10
5 6 7 8 9
*/