1.今天发现了一个螺旋矩阵的简单思路,清晰易懂。

 

2.之下为代码,均为逆时针旋转,四个方向

 

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstring>
#include <windows.h>
typedef unsigned long long ll;
const int INF=1e9;
const int maxn=1e6+5;
using namespace std;
int num[(int)(1e3+5)][(int)(1e3+5)];
int main()
{
    int tot=0;
    printf("请输入螺旋矩阵的长与宽:\n");
    int m,n;
   while(~scanf("%d%d",&m,&n))
   {
        while(2)
        {
            system("cls");
            memset(num,0,sizeof(num));
            tot=0;
            printf("\n*********************\n");
            printf("\n*    1-左上角循环   *\n");
            printf("\n*    2-右上角循环   *\n");
            printf("\n*    3-左下角循环   *\n");
            printf("\n*    4-右下角循环   *\n");
            printf("\n*    5-重新定义长宽 *\n");
            printf("\n*********************\n");
            printf("请输入您的选择:");
            int cho;
            scanf("%d",&cho);
            int x,y;
            system("cls");
            if(cho==1)
            {
                x=0;y=1;
                while(tot<m*n)//赋值旋转
                {
                    while(x+1<=n&&!num[x+1][y])  num[++x][y]=++tot;
                    while(y+1<=m&&!num[x][y+1])  num[x][++y]=++tot;
                    while(x-1>=1&&!num[x-1][y])  num[--x][y]=++tot;
                    while(y-1>=1&&!num[x][y-1])  num[x][--y]=++tot;
                }
                for(int i=1;i<=n;i++)
                {
                    for(int k=1;k<=m;k++)
                        printf("%5d",num[i][k]);
                    printf("\n");
                }
                system("pause");
            }
            else if(cho==2)
            {
                x=1;y=m+1;
                while(tot<m*n)
                {
                    while(y-1>=1&&!num[x][y-1])  num[x][--y]=++tot;
                    while(x+1<=n&&!num[x+1][y])  num[++x][y]=++tot;
                    while(y+1<=m&&!num[x][y+1])  num[x][++y]=++tot;
                    while(x-1>=1&&!num[x-1][y])  num[--x][y]=++tot;
                }
                for(int i=1;i<=n;i++)
                {
                    for(int k=1;k<=m;k++)
                        printf("%5d",num[i][k]);
                    printf("\n");
                }
                system("pause");

            }
            else if(cho==3)
            {
                x=n;y=0;
                while(tot<m*n)
                {
                    while(y+1<=m&&!num[x][y+1])  num[x][++y]=++tot;
                    while(x-1>=1&&!num[x-1][y])  num[--x][y]=++tot;
                    while(y-1>=1&&!num[x][y-1])  num[x][--y]=++tot;
                    while(x+1<=n&&!num[x+1][y])  num[++x][y]=++tot;
                }
                for(int i=1;i<=n;i++)
                {
                    for(int k=1;k<=m;k++)
                        printf("%5d",num[i][k]);
                    printf("\n");
                }
                system("pause");
            }
            else if(cho==4)
            {
                x=n+1;y=m;
                while(tot<m*n)
                {
                    while(x-1>=1&&!num[x-1][y])  num[--x][y]=++tot;
                    while(y-1>=1&&!num[x][y-1])  num[x][--y]=++tot;
                    while(x+1<=n&&!num[x+1][y])  num[++x][y]=++tot;
                    while(y+1<=m&&!num[x][y+1])  num[x][++y]=++tot;
                }
                for(int i=1;i<=n;i++)
                {
                    for(int k=1;k<=m;k++)
                        printf("%5d",num[i][k]);
                    printf("\n");
                }
                system("pause");
            }
            else
                break;
        }
        printf("\n请输入螺旋矩阵的长与宽:\n");
   }
    return 0;
}

PS:思路非常清晰,先判断在继续,绕四周旋转,如果为0并且没超出边界则继续赋值,详情看代码和注释。