蛇形矩阵(C++)

蛇形矩阵(C++)

文章目录

    • 蛇形矩阵(C++)
          • 一.题目
          • 二.思路分析
          • 三.代码实现
          • 四.运行结果

一.题目
蛇形矩阵(C++)_第1张图片

输入:

3
3
6
2

输出:

1 2 3
8 9 4
7 6 5

1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11

1 2
4 3
二.思路分析
  1. 从蛇形矩阵中不难发现,它从外圈向内,一圈一圈构成一个n/2的循环。所以我们只需要写出第一圈是怎么形成的即可。
for(i = 0; i < n/2; i++); 
蛇形矩阵(C++)_第2张图片
蛇形矩阵(C++)_第3张图片
for(j = i; j < n-i; j++)
{
	c++;
	*(*(num+i)+j) = c;
}
蛇形矩阵(C++)_第4张图片
for(j = i+1; j < n-i; j++)
{
  	c++;
	*(*(num+j)+n-i-1) = c;
}
for(j = n-i-2; j >= i; j--)
{
    c++;
    *(*(num+n-i-1)+j) = c;
}
for(j = n-i-2; j > i; j--)
{
    c++;
	*(*(num+j)+i) = c;
}
  1. 此外,我们还可以看出,当n为奇数时,矩阵有中心点n*n;当n为偶数时,矩阵没有中心点。
if(n % 2 == 1)
    *(*(num+n/2)+n/2) = n*n;
  1. 在函数snake中,定义二维动态数组num,在函数末尾向主函数返回num。
int **snake(int n)
{
	...
	int **num = new int *[n];
	for(i = 0; i < n; i++)
	{
		num[i] = new int [n];
		memset(num[i],0,sizeof(int)*n);
	}
	...
	return num;
}
  1. 在主函数中,定义一个二维数组接受snake函数返回的二维数组,输出结果并释放内存。
int main()
{
	...
	int **num;
	num = snake(n);
	for(i = 0; i < n; i++)
	{
		cout << num[i][0];
		for(j = 1; j < n; j++)
			cout << ' ' << num[i][j];
		cout << endl;
	}
	for(i = 0; i < n; i++)
		delete [] num[i];
	delete [] num;
	...
}
三.代码实现
#include 
#include 
using namespace std;
int **snake(int n)
{
	int i, j;
	int c = 0;
	int **num = new int *[n];
	for(i = 0; i < n; i++)
	{
		num[i] = new int [n];
		memset(num[i],0,sizeof(int)*n);
	}
		
    for(i = 0; i < n/2; i++)
    {
    	for(j = i; j < n-i; j++)
    	{
    		c++;
			*(*(num+i)+j) = c;
		}
    	for(j = i+1; j < n-i; j++)
    	{
    		c++;
			*(*(num+j)+n-i-1) = c;
		}	
    	for(j = n-i-2; j >= i; j--)
    	{
    		c++;
    		*(*(num+n-i-1)+j) = c;
		}	
    	for(j = n-i-2; j > i; j--)
    	{
    		c++;
			*(*(num+j)+i) = c;
		}	 
	}
    if(n % 2 == 1) 
		*(*(num+n/2)+n/2) = n*n;	
	return num;
}
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n, i, j;
		int **num;
		cin >> n;
		num = snake(n);
		for(i = 0; i < n; i++)
		{
			cout << num[i][0];
			for(j = 1; j < n; j++)
				cout << ' ' << num[i][j];
			cout << endl;
		}
		for(i = 0; i < n; i++)
			delete [] num[i];
		delete [] num;
	}
	return 0; 
}
四.运行结果
蛇形矩阵(C++)_第5张图片

你可能感兴趣的:(典型题目,c++,算法)