本文目錄一覽:
- 1、一個5×5的螺旋矩陣如下所示,C語言編寫程序輸出N x N的螺旋矩陣 (N
- 2、螺旋矩陣C語言實現
- 3、用C語言設計算法輸出一個5*5階的螺旋方陣
- 4、c語言螺旋方陣
- 5、C語言螺旋矩陣
- 6、C語言如何打印螺旋方陣?最好能夠說說思路。
一個5×5的螺旋矩陣如下所示,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\”); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/205878.html