二维数组-----螺旋性矩阵输出

题目有点难,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");
	}
}

交给读者细品,(发现我很喜欢说啊)。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值