挺有意思的一道考验思维的题,讲解见注释啦!
#include<iostream>
using namespace std;
int main(){
int n,a[15][15],x=0,y=0;
cin>>n;
int b1=n-1,b2=n-1,b3=0,b4=1,dir=1;//1,2,3,4 分别代表右边界,下边界,左边界,上边界,注意初始化要正确哟~(dir 数字对应的方向与边界遵循同样的规则)
int c=1;
while(c<=n*n){
if(dir==1){
//向右走
a[x][y++]=c++;
if(y==b1){
dir=2;b1--;}//走到了右边界就向下转向,同时缩小右边界(下面的判断分支思路类似,不再赘述)
}
else if(dir==2){
a[x++][y]=c++;
if(x==b2){
dir=3;b2--;}
}
else if(dir==3){
a[x][y--]=c++;
if(y==b3){
dir=4;b3++;}
}
else{
a[x--][y]=c++;
if(x==b4){
dir=1;b4++;}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%3d",a[i][j]);//占三位输出
}
cout<<endl;
}
return 0;
}
测试: