c语言螺旋矩阵
① c语言编程实现一个螺旋矩阵,例如输入 2 4 输出:1 2 3 4 8 7 6 5
#include<stdio.h>
#define N 20
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=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++;
else if(left||up)
y--;
else if(up||right)
x--;*/
if(right)
{
// if(up)
// x--;
// else
y++;
}
else if(left)
{
// if(down)
// x++;
// else
y--;
}
else if(down)
{
// if(right)
// y++;
// else
x++;
}
else if(up)
{
// if(left)
// y--;
// else
x--;
}
}
}
void output(int a[][N],int m, int n)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf(" ");
}
}
void main()
{
int a[N][N]={0};
int m,n;
printf("please input num: ");
scanf("%d%d",&m,&n);
matrx1(a,m,n);
output(a,m,n);
}
这是改好的程序,主要有三个问题
这个定义应该改成这样:a[N][N]={0};
right和down的条件忘记减一了;
每一个if里面变化应该是固定的,只需变化一个坐标就可以了,因为只能横竖移动,所以一次只需要变化一个x,或者一个y。
ps.提供另一个思路,直接按行分奇偶情况就可以了,偶数是顺序,奇数时倒序
② 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语言编写螺旋矩阵用C语言怎么编写螺旋矩阵
#include #define N 20 void matrx1(int a[][N],int m,int n) { int d,x=0,y=0; int right,left,up,down; for(d=1;d
#include #include #include #define N 5 void main() { int arry[N][N]={0}; inti,j,a,b; int n=1; int L; L=(N+1)/2; for (i=0;i
④ 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语言实现
说一下这个螺旋矩阵的实现方式。
首先,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>
#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++)
{
b=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语言题!
#include<stdio.h>
//基本思想是将所有数按照螺旋顺序存入2维数组,再输出
intmain()
{
intn,u,d,l,r,i,j,mat[100][100]={0};//定义各个变量,其中u,d,l,r为存入数组时的上下左右边界。
scanf("%d",&n); //输入n的值
for(i=1;i<=n;i++) //先存数组第一行,i为数组里存入的数,在程序中一直递增
{
mat[0][i-1]=i;
}
u=1;d=n-1;l=0;r=n-1; //初始化螺旋的上下左右边界,因为存入了第一行,所以u=1
while(1) //此循环实现螺旋顺序存入数据
{
for(j=u;j<=d;j++,i++) //由上到下存入最右边的一列数
{
mat[j][r]=i;
}
r--; //右边界减一
for(j=r;j>=l;j--,i++) //由右到左存入最下边的一行数
{
mat[d][j]=i;
}
d--;//下边界减一
if(i>=(n*n))break; //判断是否存满,存满跳出
for(j=d;j>=u;j--,i++) //由下到上存入最左边的一列数
{
mat[j][l]=i;
}
l++;//左边界加一
for(j=l;j<=r;j++,i++) //由左到右存入上边的一行数
{
mat[u][j]=i;
}
u++;//上边界加一
if(i>=(n*n))break;//判断是否存满,存满跳出
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",mat[i][j]);
}
printf(" ");
}
}
⑧ C语言中,螺旋矩阵(用define N,用输入n),怎么用未知n建立二维数组我不会
可以建立一个大点的二维数组
int
*array(int
n)//n为N阶,通过输入得
{
static
int
erweishuzu[50][50];//建立二维数组
这边必须用static
int
m=1,i,j;//m为写入数,i,j为行列
for
(k=0;k<(n+1)/2,k++)//(k+1)为由外到内的闭合环数,即循环数
{
for(i=0+k;i<n-k;i++)
//自左至右写入
erweishuzu[k][i]=m++;
for
(j=k+1;j<n-k;j++)
//再自上至下写入
erweishuzu[j][i]=m++;
for
(;--i>=k;i--)
//再自右至坐写入
erweishuzu[j][i]=m++;
for
(;--j>k+1;j++)
//再自下至上写入
erweishuzu[j][i]=m++;
}
return(*erweishuzu);
}
⑨ 求一个C语言程序设计:螺旋矩阵.
螺旋矩阵:
#include<stdio.h>
main()
{
int a,b,k,n,i,j,a1,b1,m;
int lines[50][50];
scanf("%d",&n);
i=j=0;a=b=n;a1=b1=0;k=1;
if(n==1)
printf(" 1\n");
else
{
for(m=1;m<2*n;m++)
{
if(m%4==1)
{
for(;j<b;j++)
{
lines[i][j]=k;
k++;
}
i++;
j--;
b--;
}
else if(m%4==2)
{
for(;i<a;i++)
{
lines[i][j]=k;
k++;
}
j--;
i--;
a--;
}
else if(m%4==3)
{
for(;j>=b1;j--)
{
lines[i][j]=k;
k++;
}
i--;
j++;
b1++;
}
else
{
for(;i>=a1+1;i--)
{
lines[i][j]=k;
k++;
}
j++;
i++;
a1++;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ if(j==0)printf(" %2d ",lines[i][j]);
else if(j==n-1)printf("%2d",lines[i][j]);
else
printf("%2d ",lines[i][j]);
}
printf("\n");
}
}
}
和的话加一下就是了;
至于你说的那些个积什么的,比较麻烦。自己再弄弄吧。