鱼C论坛

 找回密码
 立即注册
查看: 2252|回复: 5

[已解决]蛇形矩阵代码

[复制链接]
发表于 2019-12-4 18:32:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
麻烦问一下,下面这个矩阵用C++应该怎么写啊?
输入一个正整数n(n<=30),输出n所对应的蛇形矩阵。举两个例子:
n=10时,蛇形矩阵为:
10 9 5 4
8 6 3
7 2
1
n=9时,蛇形矩阵为:
9 8 4 3
7 5 2
6 1
最佳答案
2019-12-4 19:16:52
本帖最后由 Croper 于 2019-12-4 19:23 编辑

直观点的方法
  1. #include <vector>
  2. #include <math.h>
  3. #include <iostream>

  4. using namespace std;

  5. vector<vector<int>> snakeMatrix(int n) {
  6.         int a = ceil((sqrt(8 * n + 1) - 1) / 2);   //确定矩阵阶数
  7.         vector<vector<int>> matrix(a, vector<int>(a, -1)); //申请一个n阶的矩阵,初始化为-1

  8.         for (int i = n, x = 0, y = 0; i > 0; i--) {    //按规则循环
  9.                 matrix[y][x] = i;

  10.                 if ((x + y) & 1) {
  11.                         x--;
  12.                         y++;
  13.                         if (x < 0) {
  14.                                 x = 0;
  15.                         }
  16.                 }
  17.                 else {
  18.                         x++;
  19.                         y--;
  20.                         if (y < 0) {
  21.                                 y = 0;
  22.                         }
  23.                 }
  24.         }
  25.         return matrix;
  26. }
复制代码



代码简短的方法:
  1. void printsnakeMatrix(int n) {
  2.         int a = ceil((sqrt(8 * n + 1) - 1) / 2);  //确定矩阵阶数
  3.         for (int y = 0; y < a; ++y) {
  4.                 for (int x = 0; x + y < a; ++x) {
  5.                         int l = x + y;
  6.                         int ans = n - l * (l + 1) / 2 - (l &1? y : x);  //计算当前位置的值:在位置(x,y)之前的数,可以分为两部分:1、前面(x+y)阶的三角形数 2、根据奇偶性不同,当前的行序号或列序号
  7.                         if (ans > 0) {
  8.                                 cout << ans << '\t';
  9.                         }
  10.                 }
  11.                 cout << endl;
  12.         }
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-4 19:16:52 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-12-4 19:23 编辑

直观点的方法
  1. #include <vector>
  2. #include <math.h>
  3. #include <iostream>

  4. using namespace std;

  5. vector<vector<int>> snakeMatrix(int n) {
  6.         int a = ceil((sqrt(8 * n + 1) - 1) / 2);   //确定矩阵阶数
  7.         vector<vector<int>> matrix(a, vector<int>(a, -1)); //申请一个n阶的矩阵,初始化为-1

  8.         for (int i = n, x = 0, y = 0; i > 0; i--) {    //按规则循环
  9.                 matrix[y][x] = i;

  10.                 if ((x + y) & 1) {
  11.                         x--;
  12.                         y++;
  13.                         if (x < 0) {
  14.                                 x = 0;
  15.                         }
  16.                 }
  17.                 else {
  18.                         x++;
  19.                         y--;
  20.                         if (y < 0) {
  21.                                 y = 0;
  22.                         }
  23.                 }
  24.         }
  25.         return matrix;
  26. }
复制代码



代码简短的方法:
  1. void printsnakeMatrix(int n) {
  2.         int a = ceil((sqrt(8 * n + 1) - 1) / 2);  //确定矩阵阶数
  3.         for (int y = 0; y < a; ++y) {
  4.                 for (int x = 0; x + y < a; ++x) {
  5.                         int l = x + y;
  6.                         int ans = n - l * (l + 1) / 2 - (l &1? y : x);  //计算当前位置的值:在位置(x,y)之前的数,可以分为两部分:1、前面(x+y)阶的三角形数 2、根据奇偶性不同,当前的行序号或列序号
  7.                         if (ans > 0) {
  8.                                 cout << ans << '\t';
  9.                         }
  10.                 }
  11.                 cout << endl;
  12.         }
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-4 19:53:45 | 显示全部楼层

谢谢啦,很详细,运行了一下,第一个程序到int>>之间需要空格
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-11 15:11:57 | 显示全部楼层

int a = ceil((sqrt(8 * n + 1) - 1) / 2);
麻烦问一下,你这句确定阶数的原理是什么啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 22:43:59 | 显示全部楼层
若a阶三角形数的值为a,有
a(a+1)/2=n
带入2次函数求根公式,有
a1=(sqrt(8*n+1)-1)/2;
a2=(-sqrt(8*n+1)-1)/2;

a2肯定是负数,舍去
所以a=(sqrt(8*n+1)-1)/2;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-12 14:22:58 | 显示全部楼层
Croper 发表于 2019-12-11 22:43
若a阶三角形数的值为a,有
a(a+1)/2=n
带入2次函数求根公式,有

好的,懂了,谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 11:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表