c语言螺旋矩阵

#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=0;i<=n/2;i++) //控制总共有几个顺时针螺旋 {
for(j=i;j<n-i;j++) //向右(改变纵坐标,保持横坐标不变) a[i][j]=number++;
for(j=i+1;j<n-i;j++) //向下(改变横坐标,保持纵坐标不变) a[j][n-i-1]=number++;
for(j=n-i-2;j>i;j--) //向左(改变纵坐标,保持横坐标不变) a[n-i-1][j]=number++;
for(j=n-i-1;j>i;j--) //向上(改变横坐标,保持纵坐标不变) a[j][i]=number++; }
for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d\t",a[i][j]);
printf("\n"); } }

Ⅱ C语言螺旋矩阵

#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=0;i<=n/2;i++) //控制总共有几个顺时针螺旋 { for(j=i;j<n-i;j++) //向右(改变纵坐内标,保持横坐标不变)容 a[i][j]=number++; for(j=i+1;j<n-i;j++) //向下(改变横坐标,保持纵坐标不变) a[j][n-i-1]=number++; for(j=n-i-2;j>i;j--) //向左(改变纵坐标,保持横坐标不变) a[n-i-1][j]=number++; for(j=n-i-1;j>i;j--) //向上(改变横坐标,保持纵坐标不变) a[j][i]=number++; } for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d\t",a[i][j]); printf("\n"); } }

Ⅲ 求C语言程序,N*N的螺旋矩阵。

#include<stdio.h>
#include <stdlib.h>

void main()
{
int i=0,j=0,n=0;
printf("请输入n:");
scanf("%d",&n);//矩阵阶数
int **p=NULL;//二维指针,存放矩阵n*n个元素
p= (int**)malloc(n*sizeof(int*));//先分配n个一维指针
if(NULL==p)
exit(1);
for (i = 0; i < n ; i++)
{
p[i] = (int*)malloc(n*sizeof(int));//为n个一维指针分配n个整型大小的空间
if (NULL==p[i])
exit(1);
}
int flag=n;//剩下矩阵的阶数控制循环
int row=0,cloumn=0;//行列标记,初始计数为0
while(flag)
{
if (flag%2)//矩阵阶数为奇数,为左下侧行列赋值
{
for (i=0;i<flag;i++)
p[row+flag-1][cloumn+flag-1-i]=flag*flag-i;
for (j=1;j<flag;j++)
p[row+flag-1-j][cloumn]=p[row+flag-1][cloumn]-j;
cloumn++;//拆去一行一列,影响下次循环列下标,加1
}
else//为偶数,为右上侧行列赋值
{
for (i=0;i<flag;i++)
p[row][cloumn+i]=flag*flag-i;
for (j=1;j<flag;j++)
p[row+j][cloumn+flag-1]=p[row][cloumn+flag-1]-j;
row++;//拆去一行一列,影响下次循环行下标,加1
}
flag--;//剩下矩阵的阶数
}
printf("%d*%d阶矩阵为:\n",n,n);
i=n;
while(i--)
printf("********");
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d\t",p[i][j]);
printf("\n");
}

for (i = 0; i < n; i++)
free(p[i]);
free(p);
}

Ⅳ 螺旋矩阵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(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,然后将其占有。
不懂的继续追问

Ⅳ 求一份C语言做的数字螺旋矩阵的程序

#include<stdio.h>
#define N 6
int main(void)
{
int i=0,j=0,m=0,n=0,num=0;
int a[N][N];
do
{
for(i=m;i<N-m;i++)
a[i][j]=++num;
--i;
if(num==N*N)break;

for(j=m+1;j<N-m;j++)
a[i][j]=++num;
j--;
if(num==N*N)break;

for(i=N-m-2;i>=m;i--)
a[i][j]=++num;
i++;
if(num==N*N)break;

for(j=N-m-2;j>m;j--)
a[i][j]=++num;
j++;
if(num==N*N)break;

++m;
}while(num<N*N);
printf("\t\t%d行%d列螺旋矩阵版权\n\n",N,N);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%6d",a[i][j]);
printf("\n");
}
}

Ⅵ c语言编程输入一个整数n,生成一个逆时针的螺旋矩阵

#include<stdio.h>
#defineN20
voidmatrx1(inta[][N],intm,intn)
{
intd,x=0,y=0;
intright,left,up,down;
for(d=1;d<=m*n;d++)
{
[x][y]=d;
right=y<n-1&&a[x][y+1]==0;
left=y>0&&a[x][y-1]==0;
down=x<m-1&&a[x+1][y]==0;
up=x>0&&a[x-1][y]==0;
/* if(right||down)
y++;
else
x++;
if(down||left)
x++;
elseif(left||up)
y--;
elseif(up||right)
x--;*/
if(right)
{
if(up)
x--;
else
y++;
}
elseif(left)
{
if(down)
x++;
else
y--;
}
elseif(down)
{
if(right)
y++;
else
x++;
}

elseif(up)
{
if(left)
y--;
else
x--;
}

}

}
voidoutput(inta[][N],intm,intn)
{
inti,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf(" ");
}

}
voidmain()
{
inta[N][N]={0};
intm,n;
printf("pleaseinputnum: ");
scanf("%d%d",&m,&n);
matrx1(a,m,n);
output(a,m,n);
}

Ⅶ c语言编写螺旋矩阵

#include <stdio.h>
#include <memory.h>
#include <cstring>
#define N 5
void main()
{
int arry[N][N]={0};
int i,j,a,b;
int n=1;
int L;
L=(N+1)/2;
for (i=0;i<L;i++)
{
=i;
for (a=i;a<N-i;a++)
{
arry[a][b]=n++;
}
a--;
for (b=i+1;b<N-i;b++)
{
arry[a][b]=n++;
}
b--;
for (a=N-i-2;a>=i;a--)
{
arry[a][b]=n++;
}
a++;
for (b=N-i-2;b>i;b--)
{
arry[a][b]=n++;
}
}
for(a=0;a<N;a++)
{
for(b=0;b<N;b++)
{
printf("%5d",arry[a][b]);
}
printf("\n\n");
}
getchar();
getchar();
}
//scanf("%d",&n);
//while(1)
//{
// for(j=0;j<n;i++)
// {
// if(j==0)
// {
// for(i=0;i<n;j++)
// {
// arry[i][j]=i;
// //printf("%d \n",arry[i][j]);
// }
// }
// else if(j==n-1)
// {
// for(i=0;i<n;i++)
// {
// arry[i][j]=3*n-2-i;
// //printf("%d \n",arry[i][j]);
// }
// }
// }
// for(i=0;i<n;i++)
// {
// if(i==0)
// {
// for(j=1;j<n-1;j++)
// {
// arry[i][j]=4*n-3-j;
// }
// }
// if(i==n-1)
// {
// for(j=1;j<n-1;j++)
// {
// arry[i][j]=n+j;
// }
// }
// }
//
// n=n-1;
// if(n==0)break;
//}

Ⅷ c语言 如何得到n阶螺旋矩阵

void matrix(int width,int height)
{
int max = 20;
int i = 0, j = 0;
int[][] a = new int[max][max];

int m = 1, s = 1;
int x1 = 0;
int y1 = 0;
int x2 = height;
int y2 = width;
while (true) {
if (s == 1) {
for (; j < y2; j++) {
a[i][j] = m++;
}
j--;
i++;
y2--;
for (; i < x2; i++) {
a[i][j] = m++;
}
i--;
j--;
x2--;
s = -1;
} else {
for (; j >= y1; j--) {
a[i][j] = m++;
}
j++;
i--;
y1++;
for (; i >= x1 + 1; i--) {
a[i][j] = m++;
}
i++;
j++;
x1++;
s = 1;
}
if (m > height * width) {
break;
}
}
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
printf(a[i][j]);
printf("\t");
}
printf("\n");
}
}