螺旋方阵 (20分)

所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式:
输入在一行中给出一个正整数N(<10)。

输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:

5

输出样例:

  1  2  3  4  5
 16 17 18 19  6
 15 24 25 20  7
 14 23 22 21  8
 13 12 11 10  9
#include<stdio.h>
int main(){
	int i,j,n;
	int a[100][100];
	int k=1;//控制循环次数
	int x=0,y=0;//爱的魔力转圈圈 
	scanf("%d",&n);
	int wall0=n-1,wall1=n-1,wall2=0,wall3=1;//初始化右下左上的墙壁 
	int direction = 0;//0向右,1向下,2向左,3向上
	a[0][0]=1; 
	while(k<=n*n){
		if(direction==0){//向右走,遇到墙壁就向下
			a[x][y++]=k++;
			if(y==wall0){
				direction=1;
				wall0--;
			}
		}
		else if(direction==1){//向下走,遇到墙壁就向左
			a[x++][y]=k++;
			if(x==wall1){
				direction=2;
				wall1--;
			}
		}
		else if(direction==2){//向左走,遇到墙壁就向上
			a[x][y--]=k++;
			if(y==wall2){
				direction=3;
				wall2++;
			}
		}
		else if(direction==3){//向上走,遇到墙壁就向右 
			a[x--][y]=k++;
			if(x==wall3){
				direction=0;
				wall3++;
			}
		}
	}
	for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%3d",a[i][j]);
        }
        printf("\n");
    }
	
	return 0;
}

当然,还有更吊的解法,by《算法竞赛入门》

#include<stdio.h>
int main(){
	int i,j,n;
	int a[100][100];
	int k=1;//控制循环次数
	int x=0,y=0;//爱的魔力转圈圈 
	scanf("%d",&n);
	a[0][0]=1; 
	while(k<n*n){
		while(y+1<n&&!a[x][y+1])  a[x][++y]=++k;//向右 
		while(x+1<n&&!a[x+1][y]) a[++x][y]=++k;//向下
		while(y-1>=0&&!a[x][y-1]) a[x][--y]=++k;//向左
		while(x-1>=0&&!a[x-1][y]) a[--x][y]=++k;//向上 
	}
	for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%3d",a[i][j]);
        }
        printf("\n");
    }
	
	return 0;
}
发布了23 篇原创文章 · 获赞 1 · 访问量 247
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览