方阵的一种算法,通过一步步走向判断来完成的。
引出问题:如何在函数中传递二维数组!来改进函数的写法。
/*
* 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];
}
*/