蜗牛——矩阵顺时针遍历

来源:互联网 发布:开淘宝怎么开 编辑:程序博客网 时间:2024/06/04 18:24
题目:输入一个矩阵,按照从外向里以顺时针顺序依次打印出每一个数字,例如:如果输入如下矩阵:
1   2   3   4
5   6   7   8
9  10 11 12
13 14 15 16

则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。

/*算法思想:由于是循环方向数字加一,故可以考虑把它右、下、左、上看成一个周期。一层就是一个周期。而每层/周期的的每个方向的尽头是有规律的。direction用来表示判断方向,依次为右、下、左、上。control(初始值为0)用来体现周期和层数,在尽头中会起作用    当方向为右时,i不变,++j,对应尽头(列)=n-1-control,依次为n-1,n-2,...,n-1-control,...当方向为下时,j不变,++i,对应尽头(行)=n-1-control,依次为n-1,n-2,.....,n-1-control,...当方向为左时,i不变,--j,对应尽头(列)=control,依次为0,1,....,control,....当方向为上时,j不变,--i,对应尽头(行)=control+1,依次为1,2,3,...,control+1,....由于方向依次为右、下、左、上,所以,direction初始值为1,即向右开始的。那么,右对应direction%4==1,下对应direction%4==2,依次类推。总的过程是先写当前这个,后探明下一个的方向*/#include<stdio.h>int num[50][50];int main(){int n,startnum,control=0,direction=1,i=0,j=0;printf("input n(0-50)");scanf("%d",&n);startnum=1;num[i][j]=startnum; //从num[i][j]开始while(startnum<n*n){switch(direction%4){case 1:   ++j;//右  if(j==n-1-control)direction++;  //到达尽头,要换方向  break;case 2: ++i;//下if(i==n-1-control)direction++;break;case 3:--j;//左if(j==control)direction++;break;case 0:--i;//上if(i==control+1)   //此时表示一个周期或层数的结束{direction++;control++;}             break;}//end switchnum[i][j]=++startnum; }//end while//输出二维数组for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%4d",num[i][j]);}printf("\n");}//end for}//end main


 方法二:

#include <IOSTREAM>#include <IOMANIP>using namespace std;int main(){int num[50][50] = {0};memset(num, 0, sizeof(num));int n = 0,j = 0,i = 0,stratnum = 1;cout << "请输入数字(0-5):";cin >> n;while (i<n && j<n && num[i][j] == 0 ){while (j< n && num[i][j] == 0 ){num[i][j++] = stratnum ++;}++i;--j;while (i<n && num[i][j] == 0 ){num[i++][j] = stratnum++;}--i;--j;while (j>=0 && num[i][j] == 0){num[i][j--] = stratnum++;}j++;i--;while (i>=0 && num[i][j] == 0){num[i--][j] = stratnum++;}i++;j++;}for (i=0 ; i<n; ++i){for (j=0; j<n; ++j)cout << setw(4) << num[i][j] ;cout << endl;}return 0;}


 

0 0