题目有点难,ok其实是很难。。。
观察样例输出,不难发现,螺旋数组中元素的递增轨迹为:右右右、下下下、左左左、上上上
简明为:右、下、左、上。可以设开始递增的元素1的位置为(x,y),那么右的运行轨迹就是:(x,y+1),下就是:(x+1,y),左则是:(x,y-1),上则是:(x-1,y)。则定义两个变量分别表示元素所在位置:x,y;由于螺旋数组中的每一个元素都是一次递增的每次都加1,那么即可定义数组a[x][y],让这个数组等于m,而m每次都要加1。
int n,m,x,y,t,a[19][19];
scanf("%d",&n);
m=1;
x=1;
y=1;
x=1;
我们的代码中右一个t变量,它的作用是:判断方向;还有一个细节,为了不让螺旋数组已知旋下去,m虽然也一次累加但大小不能超过m*m。当m<=m*m的时候才执行:右右右、下下下、左左左、上上上,这些操作。可以想到用while循环来解决。
while(m<=n*n){ a[x][y]=m; m++; if(t==1){//右 if(a[x][y+1]>0||x>n||y+1>n||x<1||y+1<1){ t++; } } if(t==2){//下 if(a[x+1][y]>0||x+1>n||y>n||x+1<1||y<1){ t++; } } if(t==3){//左 if(a[x][y-1]>0||x>n||y-1>n||x<1||y-1<1){ t++; } } if(t==4){//上 if(a[x-1][y]>0||x-1>n||y>n||x-1>1||y<1){ t++; } } if(t>4){ t=1; } if(t==1){ y++; } if(t==2){ x++; } if(t==3){ y--; } if(t==4){ x--; } }
然后拼装:(成就AC)
#include<cstdio>
int n,m,x,y,t,a[19][19];
int main(){
scanf("%d",&n);
m=1;
x=1;
y=1;
t=1;
while(m<=n*n){
a[x][y]=m;
m++;
if(t==1){
if(a[x][y+1]>0||x>n||y+1>n||x<1||y+1<1){
t++;
}
}
if(t==2){
if(a[x+1][y]>0||x+1>n||y>n||x+1<1||y<1){
t++;
}
}
if(t==3){
if(a[x][y-1]>0||x>n||y-1>n||x<1||y-1<1){
t++;
}
}
if(t==4){
if(a[x-1][y]>0||x-1>n||y>n||x-1<1||y<1){
t++;
}
}
if(t>4)
{
t=1;
}
if(t==1){
y++;
}
if(t==2){
x++;
}
if(t==3){
y--;
}
if(t==4){
x--;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
}
交给读者细品,(发现我很喜欢说啊)。。。。