欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

蛇形数组

程序员文章站 2024-03-15 23:21:42
...

一、蛇形数组

蛇形数组

          定义x横坐标,y纵坐标,n为几行几列,把数组分为左上半部分(包括对角线)和右下半部分(不包含对角线)。

         左上半部分循环定义k为第几斜排k从0开始,到k<n结束,里面又包括奇数斜排和偶数斜排,奇数斜排需要知道右上角坐标(k,0),递增循环条件x>=0 (或者y<=k),偶数排的话只需要知道左下角坐标(0,k),递增循环条件y>=0(或者x<=k)

         右下半部分首先要定义一个标识,知道第n排是奇数排还是偶数排,才能推出下一排是奇数还是偶数,假如第n排(也就是对角线斜排)为奇数排,则定义它的flag为1,否则定义它的flag为0,然后实现它下半部分的k从1开始,不包括对角线那一排,假如flag为1,即对角线下一斜排是奇数,则第一排需要知道左下角坐标(k,n-1)递增循环条件(x<n),最后要记得改变flag。假如flag为0 ,即对角线的下一斜排是偶数,需要知道右上角坐标(n-1,k),递增循环条件(y<n),最后改变flag。

最后通过两个循环,输出蛇形数组,即二维数组

二、代码实现

#include <iostream>
using namespace std;


#define MAX_SIZE 100
int arr[MAX_SIZE][MAX_SIZE];

int main()
{
	int x = 0, y = 0,sum = 1;
	int n;
	cout << "请输入你要的行数:";
	cin >> n;

	for (int k = 0; k < n; k++)//左上半部分,包括对角线上的一排
	{
		if ((k & 1) == 0)//偶数斜排//  (k%2) != 0
		{
			x = 0;
			y = k;
			while (y >= 0)//   或者循环条件 x <= k

			{
				arr[x++][y--] = sum++;
			}
		}
		else//基数斜排
		{
			y = 0;
			x = k;
			while (x >= 0)//  循环条件 y<= k
			{
				arr[x--][y++] = sum++;
			}
		}
	}

	//右下半部分,不包含对角线
	int flag;//flag为1是奇数排, flag为0 是偶数排
	if ((n & 1) == 0)//n斜排是偶数
		 flag = 1;//flag为1,标识下一斜排是奇数,从右上向左下递增
	else//n斜排是基数
		flag = 0;//flag 为0,标识下一斜排是偶数,从左下向右上递增
	for (int k = 1; k < n; k++)//k = 1是不包括斜对角
	{
		if (flag == 0)////对角线那一排是奇数排的话,则下一排基就是偶数排
		{	
			x = n - 1;
			y = k;
			while (y < n)
			{
				arr[x--][y++] = sum++;
			}
			flag = 0;//这一斜排赋值完毕,记得改变标记
		}
		else////对角线那一排是偶数排的话,则下一排就是奇数排
		{	
			x = k;
			y = n - 1;
			while (x < n)
			{
				arr[x++][y--] = sum++;
			}
			flag = 1;//改变flag
		}
	}
//输出蛇形数组
	for (int i = 0; i < n; i++)//两层循环
	{
		for (int j = 0; j < n; j++)
		{
			printf("%4d", arr[i][j]);
		}
		cout << endl;
	}
	return 0;
}


三、控制应用平台效果

蛇形数组