蛇形数组
程序员文章站
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;
}
三、控制应用平台效果
上一篇: 蛇形数组的实现
推荐阅读
-
蛇形数组
-
蛇形数组的实现
-
给定一个数组, 求如果排序之后, 相邻两数的最大差值, 要求时 间复杂度O(N), 且要求不能用非基于比较的排序。
-
LeetCode-Algorithms-[Easy]1150. 检查一个数是否在数组中占绝大多数
-
算法题:求一个数在数组中出现的位置
-
【LeetCode(Java) - 1150】检查一个数是否在数组中占绝大多数
-
[二分法]leetcode1157:子数组中占绝大多数的元素(hard)
-
【LeetCode 力扣 414】第三大的数 ,给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
-
【算法】给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序
-
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。要求时间复杂度优于O(nlogn)