蛇行方阵的算法

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

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

/*
 *   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];
 }

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值