[数据结构 & 算法] codevs1160-蛇形矩阵(螺旋矩阵)

小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

输入描述 Input Description

n(即n行n列)

输出描述 Output Description

n+1行,n行为组成的矩阵,最后一行为对角线数字之和

样例输入 Sample Input

3

样例输出 Sample Output

5 4 3
6 1 2
7 8 9
25

在网上看见有一种螺旋矩阵,是从外往里转,这个是从里往外转,也许这个题目叫螺旋矩阵会比较合适吧,上代码。

#include <iostream>
#include<algorithm>
#include<memory.h>
using namespace std;

int n;
int a[101][101];
int num = 1;//记录当前的数字
int row=50, col=50;//记录当前的行列号
int sum = 1;//记录对角线的和
int flag[4];//对四角的数字进行标记

int main()
{
	a[50][50] = 1;//将中心初始化为1
	cin >> n;
	for (int i=3;i<=n;i=i+2)
	{
		memset(flag, 0, sizeof(flag));
		col++;//每一圈的开始都是要先向右走一步
		num++;
		a[row][col] = num;
		for (int j=1;j<(i-1)*4;j++)//计算可知每一圈元素的个数为4*n-4,减去的4是重复计算的,n圈的大小
		{//整个循环进行4*(i-1)-1次,因为在外面已经走了一步
			if (j < i - 1)
			{//向上走
				row--;
				num++;
				a[row][col] = num;
			}
			else if (j < 2 * (i - 1))
			{//向左走
				if (flag[0]==0)
				{
					flag[0] = 1;
					sum += num;//右上角
				}
				col--;
				num++;
				a[row][col] = num;
			}
			else if (j < 3 * (i - 1))
			{//向下走
				if (flag[1] == 0)
				{
					flag[1] = 1;
					sum += num;//左上角
				}
				row++;
				num++;
				a[row][col] = num;
			}
			else
			{//向右走
				if (flag[2] == 0)
				{
					flag[2] = 1;
					sum += num;//左下角
				}
				col++;
				num++;
				a[row][col] = num;
			}
			
		}
		sum += num;//右上角
	}
	for (int i=50 - n / 2;i<= 50 + n / 2;i++)
	{
		for (int j= 50 - n / 2;j<= 50 + n / 2;j++)
			cout << a[i][j] << " ";
		cout << endl;
	}
	cout << sum;
	cin >> n;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值