C語言三角螺旋
A(ax, ay) B(bx, by) C(cx, cy) 移動後A(ax0, ay0)...
1)ax = r*cosα ay = r*sinα
ax0 = r*cos(α+90) ay0=r*sin(α+90) 用三角函數展開就ok了
2)旋轉90度就是坐標點從一個象限旋轉到另一個象限,先判斷正負,再將橫縱坐標交換並根據正負情況乘以-1或者1 這個問題就是高中解析幾何的旋轉問題。或者圖形學里的二維圖形旋轉問題
『貳』 c語言螺旋
可以弄一個演示程序
#include<stdio.h>
ints[20][20],N;
voidoutput()
{
inti,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",s[i][j]);
putchar(' ');
}
}
main()
{
inti=0,j=0,k=1,n;
printf("inputanumber:");/*輸入n*n階的n*/
scanf("%d",&N);
for(n=0;n<(N+1)/2;n++)
{
while(j<N-n)//這里是向右
s[i][j++]=k++;
i++;
j--;
while(i<N-n)//這里是向下
s[i++][j]=k++;
i--;
j--;
while(j>=n)//這里是向左
s[i][j--]=k++;
i--;
j++;
while(i>n)//這里是向上
s[i--][j]=k++;
i++;
j++;
printf("n=%d時候 ",n);
output();
}
}
可以看到是依此一層一層填充的。
『叄』 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語言實現
說一下這個螺旋矩陣的實現方式。
首先,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,然後將其佔有。
不懂的繼續追問