螺旋矩阵C程序.doc_第1页
螺旋矩阵C程序.doc_第2页
螺旋矩阵C程序.doc_第3页
螺旋矩阵C程序.doc_第4页
螺旋矩阵C程序.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#define N 500main()int num,i,j,m,k=1,sNN; printf(请输入一个整数:);scanf(%d,&num); if(num%2=0)m=num/2; /m是矩阵圈数elsem=num/2+1;for(i=0;im;i+) /外层的循环用来控制螺旋方阵的圈数for(j=i;jnum-i;j+) /控制每圈的上行元素的赋值sij=k;k+;for(j=i+1;j=i;j-) /控制每圈的下行的元素的赋值 snum-i-1j=k;k+;for(j=num-2-i;ji;j-) /控制每圈的左列的元素的赋值 sji=k;k+;printf(n矩阵如下图所示:n);for(i=0;inum;i+) /输出矩阵for(j=0;j=0。如图每圈最大值分别是1、9、25、49、81.,算出每圈的max后,就分4条边分别计算每圈的其他值。通过坐标落在该圈4条边的哪条边上,按照不同的公式计算出具体坐标点的值。以第3圈(max=49)为例,4条边划分如下图(以颜色区分):这里先给出4条边上各坐标上的值与max的对应关系为:上边:Utop = max+(x+y);左边: Uleft= max+(3*x-y);下边:Ubottom = max + (-x - 5*y);右边:Uright = max+(-7*x+y);那么这些关系是怎么得出来的呢?再看图中画上圈的数字(将其值表示为topBase,xxBase),我们称其为每条边的基准值:在上边,y坐标不变,x坐标变化步长为1。令x=0,此时,topBase=max+y作为该边的基准值,其他值随x的变化而变化,得在该区域u=max+y+x;同理,在左边,x坐标不变,y坐标变化步长为1。令y=0,此时,u=max+3*x作为该边的基准值,其他值随y的变化而变化,得在该区域u=vc+3*x-y;同理得其他俩区域的表达式。不再赘述。观察这些基准值与max值之间关系,不难发现,这些基准值与max之间的差分别是1C(上边),3C(左边),5C(下边),7C(右边)(C表示当前圈数),在上边和下边,y坐标表示(或等于)圈数(即C=y),而在左边和右边,x坐标表示(或等于)圈数(即C=x)。因此前面提到的差值又可用坐标表示成1y,3x,5y,7x。因此就产生了各边基准值的计算公式:topBase=max+yleftBase=max+3xbottomBase=max-5yrightBase=max-7x(注意坐标的符号,负数加,正数减,因为基准值肯定都比max要小) 下面得出每条边的值,首先考虑上边和下边,这2条边,在基准值的基础上,由x坐标控制增减,因此:topValue=topBase+x=max+y+x(上边,随x赠而赠,因此是加x)bottomValue=bottomBase-x=max-5y-x(下边,随x赠而减,因此是减x)同理,左边和右边,则在基准值的基础上,由y坐标控制增减,因此:leftValue=leftBase-y=max+3x-y(左边,随y赠而减,因此是减y)rightValue=rightBase+y=max-7x+y(右边,随y赠而赠,因此是加y)程序实现#include Void spiral(int x, int y) int c = max0(abs0(x), abs0(y);/ 当前坐标所在圈 int max1 = (c * 2 + 1) * (c * 2 + 1);/ 当前圈上最大值 if (y = -c) / 上边 return max1 + (x + y); else if (x = -c) / 左边 return max1 + (3 * x - y); else if (y = c) / 下边 return max1 + (-x - 5 * y); else / 右边 Return1 max + (-7 * x + y); int max0(int n1, int n2) return n1 n2 ? n1 : n2; int abs0(int x) return x 0 ? x : -x; main(String args) for (int y = -5; y = 5; +y) for (int x = -5; x = 5; +x) printf(%5d, spiral(x, y); printf(); 82 81 80 79 78 77 76 75 74 7383 50 49 48 47 46 45 44 43 7284 51 26 25 24 23 22 21 42 7185 52 27 10 9 8 7 20 41 7086 53 28 11 2 1 6 19 40 6987 54 29 12 3 4 5 18 39 6888 55 30 13 14 15 16 17 38 6789 56 31 32 33 34 35 36 37 6690 57 58 59 60 61 62 63 64 6591 92 93 94 95 96 97 98 99 100*/看到这个方阵,一想到的就是找规律。这个题目规律只有两个 转圈 自加/转圈就要给数组元素定位,主要做的工作就是找规律然后根据规律用for简化,然后再赋值。/如果把一圈当作一个循环的话,那整体循环N/2次#include using namespace std;int main()const int N=10;/这个就不说了/先建立一个二维数组int aNN;/为了观察运行出的错,先把数组各个元素通通赋为0吧,这样一来,有什么错误在运行时候,一看就能看出来。for(int i=0;iN;i+)for(int j=0;jN;j+)aij=0;/试了一下从1赋值,感觉很费事,还是从后往前推吧,最后一个数字是N*Nint last=N*N;int n=N; /中间变量。int i=n-1,j;/第一个循环要用到i(第54行),所以赋个初值for(int k=0;kk;j-)/给100-92赋值aij=last-;for(i=n-1;ik;i-)/给91-83赋值aij=last-;for(;jn-1;j+) /给82-74赋值aij=last-;for(;in-1;i+) /给73-65aij=last-;/最外面的一圈赋值完成了,进行下一圈。n-;i-;/显示数组各个元素for(int i=0;iN;i+)for(int j=0;jN;j+)coutaijt;if(j=N-1) /这要注意换行。coutendlendl;return 0;/code82 81 80 79 78 77 76 75 74 7383 50 49 48 47 46 45 44 43 7284 51 26 25 24 23 22 21 42 7185 52 27 10 9 8 7 20 41 7086 53 28 11 2 1 6 19 40 6987 54 29 12 3 4 5 18 39 6888 55 30 13 14 15 16 17 38 6789 56 31 32 33 34 35 36 37 6690 57 58 59 60 61 62 63 64 6591 92 93 94 95 96 97 98 99 100*/看到这个方阵,一想到的就是找规律。这个题目规律只有两个 转圈 自加/转圈就要给数组元素定位,主要做的工作就是找规律然后根据规律用for简化,然后再赋值。/如果把一圈当作一个循环的话,那整体循环N/2次#include using namespace std;int main()const int N=10;/这个就不说了/先建立一个二维数组int aNN;/为了观察运行出的错,先把数组各个元素通通赋为0吧,这样一来,有什么错误在运行时候,一看就能看出来。for(int i=0;iN;i+)for(int j=0;jN;j+)aij=0;/试了一下从1赋值,感觉很费事,还是从后往前推吧,最后一个数字是N*Nint last=N*N;int n=N; /中间变量。int i=n-1,j;/第一个循环要用到i(第54行),所以赋个初值for(int k=0;kk;j-)/给100-92赋值aij=last-;for(i=n-1;ik;i-)/给91-83赋值aij=last-;for(;jn-1;j+) /给82-74赋值aij=last-;for(;in-1;i+) /给73-65aij=last-;/最外面的一圈赋值完成了,进行下一圈。n-;i-;/显示数组各个元素for(int i=0;iN;i+)for(int j=0;jN;j+)coutaijt;if(j=N-1) /这要注意换行。coutendlendl;return 0;#include #includevoid main()int i,j,n,number=1,a3030;printf(Please input a number N:);scanf(%d,&n);for(i=0;i=n/2;i+) /控制总共有几个顺时针螺旋fo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论