【程序设计训练】2-19 数圈

问题描述

以1为中心,用2,3,4, …, n, …, n*n的数字围绕着中心输出数圈, 如若n=4,则

7 8 9 10

6 1 2 11

5 4 3 12

16 15 14 13

输入形式

一个整数n(1<=n<=10)

输出形式

数圈矩阵

样例输入

5

样例输出

21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13

参考代码

#include <iostream>
using namespace std;

int main() {
	int n;
	cin>>n;
	int res[n][n];//矩阵 
	int sx,sy;//起始位置res[sx][sy] 
	int loop=n/2;//循环次数
	int count=n*n;//起始数为n*n,从大到小赋值
	int offset=1;//偏移量
	int i,j;
	if(n%2) {//n为奇数
		sx=0;sy=n-1;//此时起始位置在右上角
		while(loop--) {//while执行循环次数
			for(j=sy; j>sy-n+offset; j--) res[sx][j]=count--;//从右向左
			for(i=sx; i<sx+n-offset; i++) res[i][j]=count--;//从上到下
			for(; j<sy; j++) res[i][j]=count--;//从左到右
			for(; i>sx; i--) res[i][j]=count--;//从下到上
			sx++;sy--;//变更起始位置
			offset+=2;//更新偏移量
		}
		res[n/2][n/2]=1;//n为奇数时,中心位置不在循环里,要单独赋值
	} else {//n为偶数
		sx=n-1;sy=0;//此时起始位置在左下角
		while(loop--) {//while执行循环次数
			for(j=sy; j<sy+n-offset; j++) res[sx][j]=count--;//从左到右
			for(i=sx; i>sx-n+offset; i--) res[i][j]=count--;//从下到上
			for(; j>sy; j--) res[i][j]=count--;//从右向左
			for(; i<sx; i++) res[i][j]=count--;//从上到下
			sx--;sy++;//变更起始位置
			offset+=2;//更新偏移量
		}
	}

	for(int x=0; x<n; x++) {
		for(int y=0; y<n; y++) {
			cout<<res[x][y]<<" ";//输出矩阵
		}
		cout<<endl;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈伦HL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值