螺旋矩阵C程序
- 格式:doc
- 大小:350.50 KB
- 文档页数:12
用C语言的螺旋数组--输出螺旋数组所谓螺旋数组,就是指向像 1 2 3 412 13 14 511 16 15 610 9 8 7这样的数组,这是一个五阶的螺旋数组,那么怎样用c语言来实现螺旋数组的输出呢?一.算法分析:以3阶为例:1 2 38 9 47 6 5转化成数组就是:a00 a01 a02a10 a11 a12a20 a21 a22看一下规律:1. a00 a01 a02 →2. a12 a22 ↓3. a21 a20 ←4. a10 ↑5. a11 →第1步是(→)写的,就是一个循环写完第2步是(↓)写的,列号(2)是跟第1步的最后一个数a02的列号相同第3步是(←)写的,行号(2)是跟第2步的最后一个数a22的行号相同第4步是(↑)写的,列号(0)是跟第3步的最后一个数a20的列号相同到此一个大循环结束。
从第5步开始,就重复以上循环二.算法设计:对于1、2阶的矩阵,大循环1次对于3、4阶的矩阵,大循环2次……所以n、n+1阶矩阵,大循环的次数应该是( n + 1 )/2也可以这样理解:第1个子循环:就像普通的循环就可以了第2个子循环:记下最后的列号,行号依次加1第3个子循环,记下最后的行号,列号依次减1第4个子循环,记下最的的列号,行号依次减1三.程序实现程序代码为:#include <stdio.h>//宏定义,定义螺旋矩阵的阶数,要想改变数组的阶数,只需在改变N的值即可#define N 5main(){int n,i,j,m=1;int a[N][N]={0};//定义螺旋数组,并初始化//螺旋数组的实现for(n=0;n<=N/2;n++){for(j=n;j<N-n;j++)a[n][j]=m++;for(i=n+1;i<N-n;i++)a[i][N-n-1]=m++;for(j=N-n-2;j>=n;j--)a[N-n-1][j]=m++;for(i=N-n-2;i>n;i--)a[i][n]=m++;}//输出螺旋数组for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}}运行的结果为:。
编程序,显示螺旋方阵: 1 2 3 412 13 14 511 16 15 610 9 8 7#include<stdio.h>#define max 10int main(){int square[max][max];int i,j,k=1,d=0,n;//d为操作向量printf("请输入螺旋方阵的阶数n:");scanf("%d",&n);if(n>max){printf("阶数超过最大值max");printf("\n");printf("Please try again");printf("\n");}else{for(i=0;i<n;++i){for(j=0;j<n;++j)square[i][j]=0; /*将方阵各个元素都赋值为零*/}i=j=0;for(;k<=n*n;k++){square[i][j]=k;//给数组赋值switch(d){case 0:if(0<=i&&i<n&&0<=(j+1)&&(j+1)<n&&square[i][(j+1)]==0)j++;/*实现列递加*/else d=1,i++;break;//退出switch语句case 1:if(0<=(i+1)&&(i+1)<n&&0<=j&&j<n&&square[(i+1)][j]==0)i++;/*实现行递加*/else d=2,j--;break;case 2:if(0<=i&&i<n&&0<=(j-1)&&(j-1)<n&&square[i][(j-1)]==0)j--;/*实现列递减*/else d=3,i--;break;case 3:if(0<=(i-1)&&(i-1)<n&&0<=j&&j<n&&square[(i-1)][j]==0)i--;/*实现行递减*/else d=0,j++;break;default:break;}}for(int a=0;a<n;a++){for(int b=0;b<n;b++){printf("%3d",square[a][b]);printf("\t");}printf("\n");}}return 0;}package java7;import java.util.Scanner;public class test5 {public static void main(String[] args) { int square[][]=new int[20][20];int i,j,k=1,d=0;//d为操作向量System.out.print("请输入螺旋方阵的阶数n:");Scanner sin=new Scanner(System.in);int n=sin.nextInt();if(n>20){System.out.print("阶数超过最大值");System.out.print("Please try again");}else{for(i=0;i<n;++i){for(j=0;j<n;++j)square[i][j]=0; /*将方阵各个元素都赋值为零*/}i=j=0;for(;k<=n*n;k++){square[i][j]=k;//给数组赋值switch(d){case 0:if(0<=i&&i<n&&0<=(j+1)&&(j+1)<n&&square[i][(j+1 )]==0)j++;/*实现列递加*/else {d=1;i++;}break;//退出switch语句case 1:if(0<=(i+1)&&(i+1)<n&&0<=j&&j<n&&square[(i+1 )][j]==0)i++;/*实现行递加*/else{d=2;j--;}break;case 2:if(0<=i&&i<n&&0<=(j-1)&&(j-1)<n&&square[i][( j-1)]==0)j--;/*实现列递减*/else {d=3;i--;}break;case 3:if(0<=(i-1)&&(i-1)<n&&0<=j&&j<n&&square[(i-1 )][j]==0)i--;/*实现行递减*/else{d=0;j++;}break;default:break;}}}for(i=0;i<n;i++){for(j=0;j<n;j++){System.out.print(""+square[i][j]);System.out.print('\t');}System.out.println();}}}。
C#反螺旋矩阵(数组)方阵using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{class Program{static void Main(string[] args){int n = 0; //螺旋方阵的阶数bool inputIsRight = false; //输入是否正确string response;do{do{Console.Write("请输入螺旋方阵的阶数(大于零的整数):");try{string iStr = Console.ReadLine();n = Convert.ToInt16(iStr);if (n < 1)inputIsRight = true;elseinputIsRight = false;Console.Write("\n");}catch{Console.Write("\n");Console.Write("输入有误," + "请重新输入螺旋方阵的阶数(大于零的整数)!\n");Console.Write("\n");}} while (inputIsRight);int[,] iArray = new int[n, n];int rc = 3, iValue = 1; //rc=0:竖着往下走给数组赋值,rc=1:横着往右走给数组赋值,//rc=2:竖着往上走给数组赋值,rc=3:横着往左走给数组赋值int i = 0, j = n;int maxRow = n, maxCol = n, minRow = -1, minCol = -1;do{switch (rc){case 3:j--;while (j > minCol){iArray[i, j] = iValue++;j--;}j++; ;minRow++;rc = 0;break;case 2:i--;while (i > minRow){iArray[i, j] = iValue++;i--;}i++;maxCol--;rc = 3;break;case 1:j++;while (j < maxCol){iArray[i, j] = iValue++;j++;}j--; ;maxRow--;rc = 2;break;case 0:i++; //防止如iVarray[0,1]这样的拐点重复赋值while (i < maxRow){iArray[i, j] = iValue++;i++;}i--;//一步完后i=maxRow(溢出),所以要i--minCol++;rc = 1;break;}} while (iValue <= n * n);int cout = 0;foreach (int ii in iArray) //输出矩阵{if (ii < 10)Console.Write(" " + ii.ToString() + " ");else if (ii < 100)Console.Write(" " + ii.ToString() + " ");elseConsole.Write(ii.ToString() + " ");cout++;if (cout % n == 0) Console.WriteLine();}Console.WriteLine("是否继续(Y/N):");response = Console.ReadLine();while ((response != "Y") && (response != "y") && (response != "N") && (response != "n")){Console.WriteLine("输入错误");Console.Write("是否继续(Y/N):");response = Console.ReadLine();}} while ((response == "Y") || (response == "y"));Console.Write("\n");Console.Write("感谢使用此程序!");Console.Read();} }}。
第7章数组——数组元素的访问与螺旋矩阵C语言程序设计C语言程序设计控制走过的格子数n*nC语言程序设计C 语言程序设计第7章 数组void SetArray(int a[][N], int len, int start, int border ) {int k;while (start <= border) {if (start == border) {a[start][start] = len; return ; } else {//top //right //bottom //leftstart++; border--; } }}void SetArray(int a[][N], int len,int n ) {int start=0, border=n-1, k, m=1; while (m <= n*n) {if (start > border) return; else if (start == border) {a[start][start] = len; return ; } else {//top //right //bottom //leftstart++; border--; }}} 控制走过的格子数 m <= n*n 控制边界 start <= borderSetArray(a, 1, n ); SetArray(a, 1, 0, n-1); SetArray(a, 10, n);SetArray(a, 10, 0, n-1);螺旋矩阵讨论⏹1)将计算螺旋方阵的程序修改为计算螺旋矩阵,即行列数任意(不一定相等),程序如何修改?⏹2)按照下面的方向生成螺旋矩阵,程序如何修改?。
螺旋矩阵算法研究作者:魏林来源:《软件导刊》2014年第10期摘要:螺旋矩阵问题是数据结构算法问题中常求解问题之一。
介绍了几种常见的螺旋矩阵,对求解螺旋矩阵的两种常用算法进行了详细分析,并在此基础上将算法转化为C语句,对两种算法的时间性能进行了测试分析。
结果表明,两种算法的时间复杂度相同,算法执行时间效率也基本一致。
关键词:螺旋矩阵;时间复杂度;C语言DOIDOI:10.11907/rjdk.143427中图分类号:TP312文献标识码:A 文章编号文章编号:16727800(2014)010005602作者简介作者简介:魏林(1981-),女,江西九江人,江西经济管理干部学院信息工程系讲师,研究方向为计算机软件技术。
1 螺旋矩阵螺旋矩阵[1]是指一个呈螺旋形状的矩阵,矩阵的数字从第一行开始至右边不断增大,向下增大,向左增大,向上增大,按此规律循环。
按旋转的方向分顺时针、逆时针螺旋矩阵,按数字开始的位置又分为由外向内、由内向外扩散螺旋矩阵,如图1所示。
图1 各种螺旋矩阵螺旋矩阵的问题常出现在公司面试、学生竞赛试题中,主要考察学生的观察能力、逻辑思维能力及对程序设计的算法设计能力。
2 螺旋矩阵常用算法求解2.1 按旋转方向构建螺旋矩阵求解从数字的起始位置开始,沿螺旋矩阵的矩形边框按照旋转的方向(顺时针或逆时针)依次给矩阵的每一个元素赋值,在计算机内存中构造出一个完整的螺旋矩阵,然后将每个矩阵元素顺序输出。
以5阶从外到内顺时针螺旋矩阵为例,对应的二维数组如图2所示。
解5阶螺旋矩阵算法思想:按顺时针方向从外向内,一层层给每个下标变量赋值。
由于用户输入螺旋矩阵的阶数N具有任意性,因而需要解决以下问题:①层数k与阶数N的关系式;②阶数N由用户输入,层数k应根据N来计算;③定义变量num,赋值后变量num的值自增1,分析每层矩形四条边元素的行标和列标变化规律,将螺旋矩阵元素按顺时针方向分成4个部分:矩阵的上半边(3行),矩阵的右半边(2列),矩阵的下半边(2行),矩阵的左半边(2列)。
如果你是在寻找生成螺旋数组的C语言代码,我可以为你提供一个简单的例子。
螺旋数组是按照螺旋形状排列数字的二维数组。
以下是一个生成螺旋数组的C语言代码示例:```c#include <stdio.h>void generateSpiralArray(int rows, int cols, int array[][cols]) {int value = 1;int startRow = 0, startCol = 0;int endRow = rows - 1, endCol = cols - 1;while (startRow <= endRow && startCol <= endCol) {// Traverse rightfor (int i = startCol; i <= endCol; i++) {array[startRow][i] = value++;}startRow++;// Traverse downfor (int i = startRow; i <= endRow; i++) {array[i][endCol] = value++;}endCol--;// Traverse leftif (startRow <= endRow) {for (int i = endCol; i >= startCol; i--) {array[endRow][i] = value++;}endRow--;}// Traverse upif (startCol <= endCol) {for (int i = endRow; i >= startRow; i--) {array[i][startCol] = value++;}startCol++;}}}void printArray(int rows, int cols, int array[][cols]) {for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%2d ", array[i][j]);}printf("\n");}}int main() {int rows, cols;printf("Enter the number of rows: ");scanf("%d", &rows);printf("Enter the number of columns: ");scanf("%d", &cols);int spiralArray[rows][cols];generateSpiralArray(rows, cols, spiralArray);printf("Spiral Array:\n");printArray(rows, cols, spiralArray);return 0;}```这个程序通过用户输入指定行和列的大小,然后生成相应的螺旋数组并打印出来。
C语言螺旋方阵解析3螺旋方阵题目:Input Height N, printf such pattern:1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9第一种解法:是用等差数列解题。
算法:1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9定义行i列j。
从外向内分层,一圈一层。
定义r:(r>=1)当前圈为第几圈。
定义N:图形高度定义l:当前圈边长ll(1)=N-1l(r)=N-2*(r-1)-1设当前圈左上角为开始。
定义d:当前行的方向(上边为0右边为1下边为2左边为3)定义pl:当前圈当前边距角的长度(向数字小的方向)定义a:当前圈共有多少个数字a(r)=4*l(r)=4*(N-2*(r-1))-4公差为-8从最外圈到当前圈求和:s(r)=a(1)*r-r*(r-1)/2*(-8)定义b:本圈第一个数字b(r)=s(r-1)+1=a(1)*(r-1)-(r-1)*(r-2)/2*(-8)+1开始计算:求r: r=min(i,N-j+1,N-i+1,j)求d: d为(i,N-j+1,N-i+1,j)与r对应,如r如第1个值,则d为第一个值... 求pl: p=(j-r,i-r,N-j+1-r,N-i+1-r)与r对应,如r如第1个值,则d为第一个值...当前数值b+l*d+plCommented by Wang Rui程序如下:main( ){ int i,j,r,l,b,d,pl,N;printf("Input Height:"); /*输入高度*/ scanf("%d",&N);for (i=1;i<=N;i++){ for (j=1;j<=N;j++) /*定位到第i行第j列*/ { r=i;d=0;pl=j-r;if (r>N-j+1) {r=N-j+1;d=1;pl=i-r;}if (r>N-i+1) {r=N-i+1;d=2;pl=N-j+1-r;}if (r>j) {r=j;d=3;pl=N-i+1-r;}/*找出圈数,边的位置,在边上的位置*/l=N-2*(r-1)-1;/*边长*/b=(4*N-4)*(r-1)-4*(r-1)*(r-2)+1;/*本圈开始的数字*/printf("%4d",b+l*d+pl);/*打印数字*/ }printf("\n");}}第二种解法:这是用几何方法解的。
螺旋矩阵问题1 按顺时针方向构建一个m * n的螺旋矩阵(或按顺时针方向螺旋访问一个m * n的矩阵):2 在不构造螺旋矩阵的情况下,给定坐标i、j值求其对应的值f(i, j)。
比如对11 * 7矩阵,f(6, 0) = 27 f(6, 1) = 52 f(6, 3) = 76 f(6, 4) = 6 3构建螺旋矩阵对m * n 矩阵,最先访问最外层的m * n的矩形上的元素,接着再访问里面一层的 (m - 2) * (n - 2) 矩形上的元素……最后可能会剩下一些元素,组成一个点或一条线(见图1)。
对第i个矩形(i=0, 1, 2 …),4个顶点的坐标为:(i, i) ----------------------------------------- (i, n–1-i)| || || | (m-1-i, i) ----------------------------------------- (m-1-i, n-1-i)要访问该矩形上的所有元素,只须用4个for循环,每个循环访问一个点和一边条边上的元素即可(见图1)。
另外,要注意对最终可能剩下的1 * k 或 k * 1矩阵再做个特殊处理。
代码:inline void act(int t){ printf("%3d ", t);}const int small = col < row ? col : row;const int count = small /2;for(int i =0; i < count;++i){const int C = col -1- i;const int R = row -1- i;for(int j = i; j < C;++j) act(arr[i][j]);for(int j = i; j < R;++j) act(arr[j][C]);for(int j = C; j > i;--j) act(arr[R][j]);for(int j = R; j > i;--j) act(arr[j][i]);}if(small &1){const int i = count;if(row <= col)for(int j = i; j < col - i;++j) act(arr[i][j]);else for(int j = i; j < row - i;++j) act(arr[j][i]);}如果只是构建螺旋矩阵的话,稍微修改可以实现4个for循环独立:const int small = col < row ? col : row;const int count = small /2;for(int i =0; i < count;++i){const int C = col -1- i;const int R = row -1- i;const int cc = C - i;const int rr = R - i;const int s =2* i *(row + col -2* i)+1;for(int j = i, k = s; j < C;++j) arr[i][j]= k++;for(int j = i, k = s + cc; j < R;++j) arr[j][C]= k++;for(int j = C, k = s + cc + rr; j > i;--j) arr[R][j]= k++;for(int j = R, k = s + cc *2+ rr; j > i;--j) arr[j][i]= k++; }if(small &1){const int i = count;int k =2* i *(row + col -2* i)+1;if(row <= col)for(int j = i; j < col - i;++j) arr[i][j]= k++;else for(int j = i; j < row - i;++j) arr[j][i]= k++;}关于s的初始值取2* i *(row + col -2* i)+1请参考下一节。
c语言课程设计螺旋矩阵一、教学目标本节课的教学目标是让学生掌握C语言编程中的螺旋矩阵算法。
通过本节课的学习,学生需要了解螺旋矩阵的概念、原理和实现方法,培养编程思维和解决问题的能力。
具体的教学目标如下:1.知识目标:–了解螺旋矩阵的定义和特点;–掌握螺旋矩阵的生成方法和算法实现;–理解螺旋矩阵在计算机科学中的应用。
2.技能目标:–能够使用C语言编写程序实现螺旋矩阵;–能够分析程序运行结果,找出问题和优化方案;–能够运用螺旋矩阵算法解决实际问题。
3.情感态度价值观目标:–培养学生对编程事业的热爱和好奇心;–培养学生勇于探索、善于合作的科学精神;–培养学生关注社会、服务人民的责任感。
二、教学内容本节课的教学内容主要包括以下几个部分:1.螺旋矩阵的概念和特点:介绍螺旋矩阵的定义、性质和应用场景;2.螺旋矩阵的生成方法:讲解如何利用C语言实现螺旋矩阵的生成;3.螺旋矩阵的算法实现:分析螺旋矩阵生成算法的原理和实现步骤;4.编程实践:让学生动手编写程序,实现螺旋矩阵并分析运行结果;5.拓展应用:探讨螺旋矩阵在其他领域的应用和实际意义。
三、教学方法为了达到本节课的教学目标,我们将采用以下教学方法:1.讲授法:教师讲解螺旋矩阵的基本概念、原理和实现方法;2.案例分析法:分析具体的螺旋矩阵实例,让学生更好地理解知识点;3.实验法:学生动手编写程序,实现螺旋矩阵,培养实际操作能力;4.讨论法:分组讨论编程过程中遇到的问题和解决方案,提高学生的合作能力。
四、教学资源为了支持本节课的教学内容和教学方法,我们将准备以下教学资源:1.教材:选用权威、实用的C语言编程教材,为学生提供理论知识支持;2.参考书:提供相关的编程书籍,方便学生课后深入学习和参考;3.多媒体资料:制作精美的PPT,直观展示螺旋矩阵的原理和实例;4.实验设备:提供计算机、编程环境等实验设备,确保学生能够动手实践。
五、教学评估本节课的教学评估将采用多元化评价方式,以全面、客观地评价学生的学习成果。