您的位置:

c语言打印螺旋矩阵的流程图,c语言输出螺旋矩阵

本文目录一览:

一个5x5的螺旋矩阵如下所示,C语言编写程序输出N x N的螺旋矩阵 (N

个人程度还不够好啊,写了好长才写出来,。:

#includestdio.h

#define

MAX

500

main()

{

int

i=0,j=0,a[MAX][MAX]={0},n,number=1,mod=1;

printf("输入阶数\n");

scanf("%d",n);

getchar();

do

{

if(a[i][j]==0)

{

a[i][j]=number;

number++;

}

if(mod==1)

{

if(jn-1a[i][j+1]==0)

j++;

else

{

i++;

mod=2;

}

}

else

if(mod==2)

{

if(in-1a[i+1][j]==0)

i++;

else

{

j--;

mod=3;

}

}

else

if(mod==3)

{

if(j=1a[i][j-1]==0)

j--;

else

{

i--;

mod=4;

}

}

else

if(mod==4)

{

if(i=1a[i-1][j]==0)

i--;

else

{

if(a[i][j+1]!=0a[i+1][j]!=0a[i-1][j]!=0a[i][j-1]!=0)

{

break;

}

j++;

mod=1;

}

}

}while(mod!=5);

for(i=0;in;i++)

{

for(j=0;jn;j++)

{

printf("%4d",a[i][j]);

}

printf("\n");

}

getchar();

}

螺旋矩阵C语言实现

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

首先,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(startfinal) 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,然后将其占有。

不懂的继续追问

用C语言设计算法输出一个5*5阶的螺旋方阵

我在ACM上写了一个N*N阶螺旋阵的题,

代码给你了,可能有点长。

输入5即有结果。

#include stdio.h

int main()

{

int n,k,a[30][30]={0},x=0,y=0,w[5]={1,1,1,1,1};

scanf("%d",n);

k=2;

a[0][0]=1;

while(k=n*n){

if(w[1](x0a[x-1][y]==0)) {

a[x-1][y]=k;

k++;

x--;

if(x0a[x-1][y]==0)

w[1]=1,w[2]=0,w[3]=0,w[4]=0;

else w[1]=0,w[2]=1,w[3]=1,w[4]=1;

}

else if(w[2](yn-1a[x][y+1]==0)){

a[x][y+1]=k;

k++;

y++;

if(yn-1a[x][y+1]==0)

w[1]=0,w[2]=1,w[3]=0,w[4]=0;

else w[1]=1,w[2]=0,w[3]=1,w[4]=1;

}

else if(w[3](xn-1a[x+1][y]==0)){

a[x+1][y]=k;

k++;

x++;

if(xn-1a[x+1][y]==0)

w[1]=0,w[2]=0,w[3]=1,w[4]=0;

else w[1]=1,w[2]=1,w[3]=0,w[4]=1;

}

else if(w[4](y0a[x][y-1]==0)){

a[x][y-1]=k;

k++;

y--;

if(y0a[x][y-1]==0)

w[1]=0,w[2]=0,w[3]=0,w[4]=1;

else w[1]=1,w[2]=1,w[3]=1,w[4]=0;

}

}

for(k=0;kn;k++){

int t=1;

for(x=0;xn;x++){

if(t){

if(n=3) printf("%-d",a[k][x]);

else if(n=9) printf("%-2d",a[k][x]);

else printf("%-3d",a[k][x]);

t=0;

}

else {

if(x==n-1) printf(" %-d",a[k][x]);

else {

if(n=3) printf(" %-d",a[k][x]);

else if(n=9) printf(" %-2d",a[k][x]);

else printf(" %-3d",a[k][x]);

}

}

}

printf("\n");

}

return 0;

}

c语言螺旋方阵

调试了一下,问题主要是起始点的控制逻辑。

修改代码和注释如下:

#includestdio.h

int main(void)

{

 int mm, i = 0, j = 0, aa[15][15], num1 = 1, num3, num2; 

 printf("Enter n(n=15):");  

 scanf("%d", mm);

 for (num2 = mm - 1; num2  0; num2--) 

 {

  if(((mm-1)/2==i)(mm%2!=0))   //处理总列数为奇数的中点值

   aa[i][j] = num1;

  //for (num3 = 0; num3  num2; num3++)   起始点逻辑有误,用下一行替换

  for (num3 = mm-num2-1; num3  num2; num3++)

  {

   aa[i][j] = num1;

   num1 = num1 + 1;

   j  = j + 1;

  } 

  //for (num3 = 0; num3  num2; num3++)    起始点逻辑有误,用下一行替换

  for (num3 = mm-num2-1; num3  num2; num3++)

  {

   aa[i][j] = num1;

   num1 = num1 + 1; 

   i = i + 1;

  }

  //for (num3 = 0; num3  num2; num3++)    起始点逻辑有误,用下一行替换

  for (num3 = mm-num2-1; num3  num2; num3++)

  {

   aa[i][j] = num1;

   num1 = num1 + 1;

   j  = j - 1;

  }

  //for (num3 = 0; num3  num2; num3++)    起始点逻辑有误,用下一行替换

  for (num3 = mm-num2-1; num3  num2; num3++)

  {

   aa[i][j] = num1;

   num1 = num1 + 1;

   i = i - 1;

  }

  i++;

  j++;

 }

 for (i = 0; i  mm; i++)

 {

  for (j = 0; j  mm; j++)

  {

   printf("%5d", aa[i][j]);

  }

  printf("\n");

 }

 return 0;

}

在VC6调试通过,如下图:

供参考。

C语言螺旋矩阵

#include stdio.h #includestdlib.h void main() { int

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

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

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

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

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

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

for(i=0;in;i++) { for(j=0;jn;j++) printf("%d\t",a[i][j]);

printf("\n"); } }

C语言如何打印螺旋方阵?最好能够说说思路。

int n为阶数,具体打印格式你可以按需要改 void op(int n) { int i=0,j=0; int*(*p); int temp = 1; int t; p = (int**)malloc(sizeof(int*)*n); for (t=0;tn;t++) { p[t]=(int*)malloc(sizeof(int)*n); } for (t=0;t((float)n/2);t++) { for (;jn-t;j++) p[i][j] = temp++; j--; i++; for(;in-t;i++) p[i][j] = temp++; i--; j--; for(;j=t;j--) p[i][j] = temp++; j++; i--; for(;it;i--) p[i][j] = temp++; j++; i++; } for (i=0;in;i++) { for (j=0;jn;j++) { printf(\"%3d \",p[i][j]); } printf(\"\\n\"); } }