问题描述
思路
- 明确:横纵坐标之和为偶数时,从下往上跑;否则从上往下跑。(从(0,0)开始)
- 将矩形分为上三角和下三角两个部分分别操作
- 上三角部分比较简单,0 <= 横纵坐标之和 < n,则令 i 表示横纵坐标之和,在[0,n)之间遍历,并根据 i 的奇偶进行不同方向的遍历。
for( i = 0; i < n; i++){
if( i%2 == 0){
for( j = i, k = 0; j >= 0, k <= i; j--, k++ )
cout << a[j][k] << ' ';
}
else{
for( j = i, k = 0; j >= 0, k <= i; j--, k++ )
cout << a[k][j] << ' ';
}
}
- 下三角部分:n <= 横纵坐标之和 <= 2n-2
用 i 来控制遍历的次数,然后就是找规律,控制起点和终点的坐标。这里自己拿纸笔写一下就有了,不一定是下列代码的方式。
for( i = n-2; i >= 0; i--){
if( i%2 == 0){
for( j = n-i-1, k = n-1; j <= n-1, k >= n-i-1; j++, k-- )
cout << a[k][j] << ' ';
}
else{
for( j = n-i-1, k = n-1; j <= n-1, k >= n-i-1; j++, k-- )
cout << a[j][k] << ' ';
}
}
完整代码
#include<iostream>
using namespace std;
const int maxm = 510;
int main(){
int a[maxm][maxm];
int n;
int i,j,k;
cin >> n;
for( i = 0; i < n; i++ ){
for( j = 0; j < n; j++ )
cin >> a[i][j];
}
//一共有2n-1次扫描
//n次上三角
for( i = 0; i < n; i++){
if( i%2 == 0){
for( j = i, k = 0; j >= 0, k <= i; j--, k++ )
cout << a[j][k] << ' ';
}
else{
for( j = i, k = 0; j >= 0, k <= i; j--, k++ )
cout << a[k][j] << ' ';
}
}
//n-1次下三角
for( i = n-2; i >= 0; i--){
if( i%2 == 0){
for( j = n-i-1, k = n-1; j <= n-1, k >= n-i-1; j++, k-- )
cout << a[k][j] << ' ';
}
else{
for( j = n-i-1, k = n-1; j <= n-1, k >= n-i-1; j++, k-- )
cout << a[j][k] << ' ';
}
}
return 0;
}