#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n][n];
int flag = 1;
int x = 0;
int y = 0;
int b = 0;
int c = n;
for(int i = 0;i<n*n;i++){
if(flag == 1){
a[x][y] = i+1;
y++;
}
else if(flag == 2){
a[x][y] = i+1;
x++;
}
else if(flag == 3){
a[x][y] = i+1;
y--;
}
else{
a[x][y] = i+1;
x--;
}
if(y == c-1 && x == b){
flag = 2;
}
else if(y == c-1 && x == c-1){
flag = 3;
}
else if(y == b && x == c-1){
flag = 4;
b++;
c--;
}
else if(x == b && y == b-1){
flag = 1;
}
}
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
这道题个人觉得好难。但是通过率竟然快60,可是解答思路和讨论却很少。估计写到这里的都是大佬吧。我一开始想的时候是有想到利用边缘值进行转向的,但是没有想到好的办法。看了下其他人的解题思路。现总结如下。分别对向下向上向左向右做四个标志值,根据行号和列号确定碰边了没有,碰边便转变标志值。当完成一次循环后,需要把行边界值加1,列边界值减1;然后从flag4 转到flag1 ,即从向上转到向左就是利用了行号加1后,减掉1等于左边界的列号