蛇行方阵的算法

方阵的一种算法,通过一步步走向判断来完成的。

引出问题:如何在函数中传递二维数组!来改进函数的写法。

/*
 *   Name:       matrix
 *   Author:     CF

 *   Created:    2010.03.21
 *   Description:sideling counting like snack      
 *   n=2 
 *   1 2 
 *   3 4 
 *   n=3 
 *   1 2 6
 *   3 5 7
 *   4 8 9
 */ 
#include<iostream.h>
#include<stdio.h>
    
const int N=5;
int **p ;


void getfz(void)
{
 p=new int *[N];
 for(int k=0;k<N;k++)
 {
  p[k]=new int [N];
 }

    int count=0;
 int i=0;
 int ii=0;
 int j=0;
 int jj=0;
 p[i][j]=++count;
  while (!((i==N-1) && (j==N-1)))
  {

    if ((i+j)%2==0 && (i-1<0||j+1>=N)) //右上斜线末 怎么走
    {
      if (((i<N) && (j+1<N)) && (i==0||i==N-1))           //向右判断可否移动
   {
    jj=j+1;
    p[i][jj]=++count;
   }
      if (((i+1<N) && (j<N))&&(j==N-1||j==0)&&(jj==j))    //向下判断可否移动
   {
    ii=i+1;
    p[ii][j]=++count;
   }
 }

    if ((i+j)%2==1 && (i+1>=N||j-1<0)) //左下斜线末 怎么走
    {
      if ((i<N && (j+1<N))&&(i==0||i==N-1))               //向右判断可否移动
   {
    jj=j+1;
    p[i][jj]=++count;
   }
      if (((i+1)<N && j<N)&&(j==N-1||j==0)&&(jj==j))      //向下判断可否移动
   {
    ii=i+1;
    p[ii][j]=++count;
   }
    }
    if ((i+j)%2==0 && (i-1>=0 && j+1<N)) //右上进发
    {
      ii=i-1;
      jj=j+1;
      p[ii][jj]=++count;
    }
    if ((i+j)%2==1 && (i+1<N && j-1>=0)) //左下进发
    {
      ii=i+1;
      jj=j-1;
      p[ii][jj]=++count;
    }
 i=ii;
 j=jj;
  }
}
void printfz(void)
{
 for(int i=0;i<N;i++)
 {
  for(int j=0;j<N;j++)
   printf("%4d",p[i][j]);
  cout<<endl;
 }
}
void deletefz(void)
{
 
 for(int k=0;k<N;k++)
 {
  delete [] p[k];
 }
 delete [] p;
}

void main(void)
{
 int i=0;
 int j=0;

 getfz();
 printfz();
 deletefz();
}

 

 

数组参数传递的问题,如果在函数void getfz(int **p)中来动态分配数据的话,那么调用函数出来用里边的赋值已经不存在了,所以不是预期的;而如果将p的动态分配放在该函数前,那么里边数据的改变会影响到调用函数后的。

原因是在做参数传递时,是一个副本。如果在函数调用前实参做了new的操作,那么调用时形参是一个副本,跟实参指向同样的地方,那么函数中对数据的改变也会影响实参的改变;

而在函数中来new的话,在函数调用前,形参和实参是副本关系,但是两指针没有确切的指向同一地方。所以在形参在函数里用new来修改指向的时候,实参并不会随之变化。
/*
 p=new int *[N];
 for(int k=0;k<N;k++)
 {
  p[k]=new int [N];
 }

*/

### 蛇形矩阵的 C++ 实现 以下是基于引用中的方法实现的一个完整的蛇形矩阵程序。该程序能够按照指定大小 `n` 输出一个 `n×n` 的蛇形矩阵。 #### 示例代码 ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入矩阵大小 int matrix[n][n]; int value = 1, i = 0, j = 0; bool flag = true; // 控制方向:true 表示向右上方 (↗),false 表示向左下方 (↙) for (value = 1; value <= n * n;) { if (flag) { // 向右上方移动 while (i >= 0 && j < n) { if (i < n && j >= 0 && matrix[i][j] == 0) { matrix[i][j] = value++; } i--; j++; } if (j >= n) { // 如果超出边界,则整位置并改变方向 j = n - 1; i += 2; } else if (i < 0) { i = 0; } flag = false; // 改变方向 } else { // 向左下方移动 while (i < n && j >= 0) { if (matrix[i][j] == 0) { matrix[i][j] = value++; } i++; j--; } if (i >= n) { // 如果超出边界,则整位置并改变方向 i = n - 1; j += 2; } else if (j < 0) { j = 0; } flag = true; // 改变方向 } } // 打印矩阵 for (int p = 0; p < n; ++p) { for (int q = 0; q < n; ++q) { cout << matrix[p][q] << " "; } cout << endl; } return 0; } ``` 此代码实现了通过控制变量 `flag` 来切换移动方向的功能,从而完成蛇形矩阵的填充过程[^4]。 --- ### § 相关问题 § 1. 如何优化上述代码以减少内存占用? 2. 是否可以使用动态分配的方式替代固定大小的二维数组?如果可行,请提供具体实现方式。 3. 对于更大的输入范围(如 `n > 1000`),如何改进算法性能? 4. 若需支持多组测试数据输入,应如何修改现有代码逻辑? 5. 可否利用 STL 中的数据结构代替手动定义的二维数组?如果有,请给出相应代码片段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值