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并且没超出边界则继续赋值,详情看代码和注释。