NYOJ_33 蛇形填数(蛇形矩阵)

本文介绍了一种螺旋矩阵的生成算法,通过将问题分解为多个子问题来简化处理过程。首先解决最外层矩阵的填充问题,然后递归地解决内部矩阵。文章提供了详细的代码实现,并讨论了代码的优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址

分析:

本题重点是分析矩阵。一开始看错了蛇,得到另一个矩阵。见附录一。

矩阵:

7 8 1

6 9 2

5 4 3

本文思路在于,先求最外层矩阵,再求内层矩阵。

最外层矩阵又可以分解成四个相似的子问题。

按照举例的矩阵来看:即 1 2、3 4、5 6、7 8。

问题引刃而解。

不过我花了很多时间,大概两个小时,因为一开始的代码没有现在的简洁。

用 i 来代表赋值的次数,可以大幅度减少思维量和代码量。

(官方给的最优代码容易想到,但是不容易表达)


#include<iostream>
using namespace std;
#define maxSize 100
int center=0;
int a[maxSize][maxSize];
int element=1;
void outArray(int c1,int c2)  //center
{
	if(c1==c2) a[c1][c2]=element; //最后一次赋值 
	int i=-1; 
	while(++i<c2-c1) a[c1+i][c2]=element++;i=-1;
	while(++i<c2-c1) a[c2][c2-i]=element++;i=-1;
	while(++i<c2-c1) a[c2-i][c1]=element++;i=-1;
	while(++i<c2-c1) a[c1][c1+i]=element++;i=-1;  
} 
int main()
{
	int n;
	cin>>n;
	while(center<=n-1-center)
	{
		outArray(center,n-1-center);
		center++;
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

附录一:

另一种蛇。

/*
/扩展的蛇形方阵
 	7 6 1
	8 5 2
	9 4 3*/
#include<iostream>
using namespace stdl
#define maxSize 100
int main()
{
	int n;
	cin>>n;
	int a[maxSize][maxSize];
	int i=0;        //行号
	int element=1; 
	
	

	 
	for (int j=n-1;j>=0;j--) //列号 
	{
		if(i==0)        //0 - n-1     
		{
			for(;i<n;i++)
				a[i][j]=element++;
		} 
		else if(i==n)            //i==n   n-1 - 0
		{
			i--;
			for(;i>=0;i--)//while(--i>=0)
				a[i][j]=element++;
			i++;              //i为0 
		}

	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值