當前位置:首頁 » 編程語言 » c語言螺旋矩陣

c語言螺旋矩陣

發布時間: 2022-09-26 06:57:53

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);

}


這是改好的程序,主要有三個問題

  1. 這個定義應該改成這樣:a[N][N]={0};

  2. right和down的條件忘記減一了;

  3. 每一個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");
}
}
}
和的話加一下就是了;
至於你說的那些個積什麼的,比較麻煩。自己再弄弄吧。

熱點內容
bat腳本卸載軟體 發布:2024-12-28 20:17:14 瀏覽:742
sqlserver的ip 發布:2024-12-28 20:16:58 瀏覽:358
c語言模塊 發布:2024-12-28 20:10:29 瀏覽:516
安卓螞蟻怎麼唱 發布:2024-12-28 20:00:21 瀏覽:163
編程課必須 發布:2024-12-28 19:58:49 瀏覽:782
怎麼合理配置家庭資產 發布:2024-12-28 19:57:10 瀏覽:317
編譯pl2303安卓驅動 發布:2024-12-28 19:53:09 瀏覽:365
怎麼看到手機wifi密碼 發布:2024-12-28 19:52:19 瀏覽:424
uia編程 發布:2024-12-28 19:49:00 瀏覽:11
安卓手機怎麼設置頂部背景 發布:2024-12-28 19:34:47 瀏覽:736