题目
题解
模拟。
比较简单的一道提高题了,控制好上下左右边界,控制好方向,输出就行了,不用管最后一个空格加不加,这个无所谓。
看代码会好理解点。
代码
#include<bits/stdc++.h>
using namespace std;
int n, m, dir = 2;
int a[210][210];
int main()
{
cin>>n>>m;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= m;j ++)
cin>>a[i][j];
int s = n*m, up = 1, left = 1, down = n, right = m; // up left down right 控制输出的边界
while(s) {
// 下面“注释中”的 up left down right均表示方向,而不是边界
// “代码中”的仍表示边界
if(dir == 1) { // up
for(int i = down;i >= up;i--, s--) cout<<a[i][right]<<' ';
right --;
dir = 3; // up->left
} else if(dir == 2) { // down
for(int i = up;i <= down;i++, s--) cout<<a[i][left]<<' ';
left ++;
dir = 4; // down->right
} else if(dir == 3) { // left
for(int i = right;i >= left;i--, s--) cout<<a[up][i]<<' ';
up ++;
dir = 2; // left->down
} else { // right
for(int i = left;i <= right;i++, s--) cout<<a[down][i]<<' ';
down --;
dir = 1; // right->up
}
}
return 0;
}