花了一个半多小时,终于摆清楚了。
思路就是从右上往左下,从左下往右上,一条一条地赋值,注意边界的变化。
先输左上三角,无需讨论。然后针对n是奇数还是偶数,右下三角的赋值步骤稍有变化。
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
int arr[100][100] = {0};
int i = 0, j = 0, k = 2;
arr[0][0] = 1;
int row = 0, col = 0;
while(row<n && col<n){
row++, col++;
if(row == n)
break;
i = 0, j = col;
while(j >= 0)
arr[i++][j--] = k++;
row++, col++;
if(row == n)
break;
i = row, j = 0;
while(i >= 0)
arr[i--][j++] = k++;
}
int up = 0, left = 0;
if(n % 2 == 0){
while(up < n && left < n){
up++, left++;
i = n-1, j = left;
while(j < n)
arr[i--][j++] = k++;
up++, left++;
i = up, j = n-1;
while(i < n)
arr[i++][j--] = k++;
}
}
else if(n % 2 == 1){
while(up < n && left < n){
up++, left++;
i = up, j = n-1;
while(i < n)
arr[i++][j--] = k++;
up++, left++;
i = n-1, j = left;
while(j<n)
arr[i--][j++] = k++;
}
}
for(i = 0; i<n; i++){
for(j = 0; j<n; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}

京公网安备 11010502036488号