逆蛇型矩阵(螺旋魔方矩阵)

    技术2022-05-11  37

    输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素。       N=3时:     1   2   3     8   9   4     7   6   5           【输入形式】     从标准输入读取一个整数N。       【输出形式】     向标准输出打印结果。输出符合要求的方阵,每个数字占5个字符宽度,向右对齐,在每一行末均输出一个回车符。     【输入样例】       4     【输出样例】             1         2         3         4           12       13       14         5           11       16       15         6           10         9         8         7     #include <iostream>using namespace std;void   SnakeMatrix(   int   **addr,   int   n   );   int main(){    int i,j,N;    bool flag = true;    while(flag)    {        cout<<"请输入维数:";         cin>>N;        if(N<2||N>9)         cout<<"非法输入"<<endl;        else         flag = false;     }    int **a = new int*[N];    for(i=0;i<N;i++)    {      a[i] = new int[N];    }     SnakeMatrix(a,N);    for(i=0;i<N;i++)    {       for(j=0;j<N;j++)         cout<<a[i][j]<<"/t";       cout<<endl<<endl<<endl;    }    for(i=0;i<N;i++)    {      delete []a[i];    }    delete []a;    system("pause");}void   SnakeMatrix(   int   **addr,   int   n   ){    enum   DIRECT   {   Up,   Down,   Left,   Right   };     int num,i,j,layer;       num=1;    i=0;    j=0;    layer = 0;    DIRECT Direct = Down;    while(num<=n*n)    {       addr[i][j]=num++;       switch(Direct)       {          case Down:              if(++i >= n-1-layer)              {                i = n-1-layer;                Direct = Right;              }              break;          case Right:              if(++j >= n-1-layer)              {                j = n-1-layer;                Direct = Up;              }               break;          case Up:               if(--i <= layer)               {                 i = layer;                 Direct = Left;               }               break;          case Left:               if(--j <= layer+1)               {                 j = layer+1;                 layer++;                 Direct = Down;               }               break;       }    }   }注释  昨晚有朋友叫我做这个题目,想了好久除了比较笨的每行每列的输入,没有想出什么好的办法。今天在网上搜索了下这类题,http://topic.csdn.net/t/20050513/14/4004333.html#-------这是链接地址。自己总结了下,才有了以上代码。另外意外发现了一个自己以前不知道的知识点,现在只是知道其然,不知道其所以然。具体情况如下:在上题中,我刚开始给SnakeMatrix()函数传的是a的二级指针,然后在该函数中以addr[i*n+j]=num++;来访问,但程序报错,若传的是二维数组的首地址,却能正常运行。

    最新回复(0)