当前位置:首页 » 编程语言 » C语言三角螺旋

C语言三角螺旋

发布时间: 2023-06-19 09:05:06

‘壹’ 用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);

}


这是改好的程序,主要有三个问题

  1. 这个定义应该改成这样:a[N][N]={0};

  2. right和down的条件忘记减一了;

  3. 每一个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,然后将其占有。
不懂的继续追问

热点内容
风变编程案例 发布:2025-04-23 10:57:52 浏览:134
子弹挂件编程 发布:2025-04-23 10:52:27 浏览:957
学生信息录入c语言 发布:2025-04-23 10:50:26 浏览:1000
美国广播公司综合编译 发布:2025-04-23 10:37:50 浏览:708
java登录验证码 发布:2025-04-23 10:32:57 浏览:598
note3ftp 发布:2025-04-23 10:23:30 浏览:840
服务器地址后面要加端口 发布:2025-04-23 10:14:42 浏览:867
安卓如何关闭自动管理 发布:2025-04-23 09:45:27 浏览:658
shell文件编程 发布:2025-04-23 09:41:43 浏览:14
安卓课程表源码 发布:2025-04-23 09:41:39 浏览:951