C语言 螺旋方阵?

Python017

C语言 螺旋方阵?,第1张

#include<stdio.h>

int main()

{int x=0,y=0,n,i,a[22][22]={0},c

scanf("%d",&n)

c=a[x][y]=1

while(c<n*n)

{while(y<n-1&&!a[x][y+1])a[x][++y]=++c //向右

while(x<n-1&&!a[x+1][y])a[++x][y]=++c //向下

while(y>0&&!a[x][y-1])a[x][--y]=++c //向左

while(x>0&&!a[x-1][y])a[--x][y]=++c //向上

}

for(x=0x<nx++)

{for(y=0y<ny++)

  printf("%4d",a[x][y])

printf("\n")

}

return 0

}

#include <stdio.h>#include<stdlib.h>void main() { int

i,j,n,number=1,a[30][30]printf("Please input a number N:")

scanf("%d",&n)for(i=0i<=n/2i++) //控制总共有几个顺时针螺旋 {

for(j=ij<n-ij++) //向右(改变纵坐标,保持横坐标不变) a[i][j]=number++

for(j=i+1j<n-ij++) //向下(改变横坐标,保持纵坐标不变) a[j][n-i-1]=number++

for(j=n-i-2j>ij--) //向左(改变纵坐标,保持横坐标不变) a[n-i-1][j]=number++

for(j=n-i-1j>ij--) //向上(改变横坐标,保持纵坐标不变) a[j][i]=number++}

for(i=0i<ni++) { for(j=0j<nj++) printf("%d\t",a[i][j])

printf("\n")} }

说一下这个螺旋矩阵的实现方式。

首先,go函数一个递归,这你得明白,而递归的实现原理类似于栈,也就是先进后出的执行方式。很多人会理解成这样的执行方式:

ri = 1, rj = 2, gi = 0, gj = 1, start = 2, dir = 0

ri = 2, rj = 2, gi = 1, gj = 3, start = 3, dir = 1

ri = 2, rj = 1, gi = 3, gj = 2, start = 4, dir = 2

ri = 1, rj = 1, gi = 2, gj = 0, start = 5, dir = 3

ri = 1, rj = 0, gi = 2, gj = -1, start = 6, dir = 3

ri = 1, rj = 1, gi = 0, gj = 0, start = 7, dir = 0

ri = 0, rj = 1, gi = -1, gj = 0, start = 8, dir = 0

ri = 1, rj = 1, gi = 0, gj = 2, start = 9, dir = 1

从start = 2开始一直往里面进,然后算到start = 9?

不,其实并不是这样,恰恰相反,递归会不断的往里面进,一直进到最里层,也就是达到条件

if(start>final) return为止。然后开始出栈,从start = 9开始算,算回到start = 8.。。一直到start = 2结束。

也就是最后的执行顺序应该是:

ri = 1, rj = 1, gi = 0, gj = 2, start = 9, dir = 1

ri = 0, rj = 1, gi = -1, gj = 0, start = 8, dir = 0

ri = 1, rj = 1, gi = 0, gj = 0, start = 7, dir = 0

ri = 1, rj = 0, gi = 2, gj = -1, start = 6, dir = 3

ri = 1, rj = 1, gi = 2, gj = 0, start = 5, dir = 3

ri = 2, rj = 1, gi = 3, gj = 2, start = 4, dir = 2

ri = 2, rj = 2, gi = 1, gj = 3, start = 3, dir = 1

ri = 1, rj = 2, gi = 0, gj = 1, start = 2, dir = 0

好了,这就是以上的原理,然后再来看你的gi和gj,处理冲突这一点理解得很对,但是不是说什么跳到05啥的,处理冲突是这一句:

if(a[ri][rj]==0),首先,ri、rj、gi、gj都是坐标(这儿不懂的追问)看上面的数据,在start 等于9、7、5的时候,ri 、rj的值是一样的,这也就冲突了,在start等于9的时候 ,

a[ri = 1][rj =1]已经不等于0了,到了if语句肯定不成立了, 自然就走的else,然后用得坐标就变成了gi和gj,也就是start = 7的时候, 位置就是a[gi][gj],实现了解决冲突的效果。

至于gi和gj什么时候+1什么时候-1这个,这个需要看一下原作者的思路,通过不同的dir去控制不同的位置,冲突的g坐标将其当做r坐标再去判断是否该位置上有值,有的话继续根据dir去寻找,一直到发现该位置是0,然后将其占有。

不懂的继续追问