void matrx1(int a[][N],int m,int n)
{
int d,x=0,y=0;
int right,left,up,down;
for(d=1;d<=m*n;d++)
{
a[x][y]=d;
//
right,left,up,down这四个变量的值是‘&&’的返回,所以只会是0或1;
right=y<n-1&&a[x][y+1]==0; //right:与down和up有关连,right的值与left一定相反。
left=y>0&&a[x][y-1]==0; //left:与down和up有关连,left的值与right一定相反,所以不用判断right与left的关系
down=x<m-1&&a[x+1][y]==0;//down:与right和left有关连,down的值与up一定相反
up=x>0&&a[x-1][y]==0; //up:与right和left有关连,up的值与down一定相反,所以不用判断up与down的关系
/*根据a[x][y]=d可以知道数组的起始位置是a[0][0],此时,它只有两种可以,第一个可能是向右移动right,第二个可能是向下移动down;
(向那个方向根据题目要求来就行了,你可以试试向下移动的代码如何写,加深对这个算法的理解。)当移动到行的末端时,
只有向下(down)移动,当移动到最大列数时,此时只能向左(left)移动,当移动到行的首位时,只能向上(up)移动。
PS:之所以这样说是因为题目或者程序定死了,所以只能是这样移动。如果你本人有兴趣的话可以多试几种变化,建议你
最好多试几种变化,可以增加你对类的了解,有利你的答辩。*/
if(right)
/*right和up同真时,向上移动,为什么是这两个同真而不是left和up同真才向上移动,你可以这样理解,就是每次由left
由真转为假时,此时的位置就是向上移动的起始位置。后面的就不多解释,一样的道理。*/
{
if(up)
x--;
else
y++;
}
流程图就不给了,你懂得这个理,流程图自己画都没问题。