#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
void test_inside_spin(
int width,
int height)
{
int X =
0;
int Y =
0;
int M =
0;
int N =
0;
int count =
1;
int total = width*height;
bool finish =
false;
if(width <=
0 || height<=
0)
{
printf(
"args error\n");
return;
}
int matrix[height][width]={
0};
while(
1)
{
for(Y=N;Y<width-N;Y++)
{
*((
int *)matrix+X*width+Y) =
count++;
if(
count > total)
{
finish =
true;
break;
}
}
Y-=
1;
if(finish)
break;
for(X=M+
1;X<height-M;X++)
{
*((
int *)matrix+X*width+Y) =
count++;
if(
count > total)
{
finish =
true;
break;
}
}
X-=
1;
if(finish)
break;
for(Y=Y-
1;Y>=N;Y--)
{
*((
int *)matrix+X*width+Y) =
count++;
if(
count > total)
{
finish =
true;
break;
}
}
N++;
Y+=
1;
if(finish)
break;
for(X=X-
1;X>M;X--)
{
*((
int *)matrix+X*width+Y) =
count++;
if(
count > total)
{
finish =
true;
break;
}
}
M++;
X+=
1;
if(finish)
break;
}
for(
int i=
0;i<height;i++)
{
for(
int j=
0;j<width;j++)
printf(
"-\t",matrix[i][j]);
printf(
"\n");
printf(
"\n");
}
}
void test_outside_spin(
int width,
int height)
{
int X =
0;
int Y =
0;
int M =
0;
int N =
0;
int count = width*height;
bool finish =
false;
if(width <=
0 || height<=
0)
{
printf(
"args error\n");
return;
}
int matrix[height][width]={
0};
while(
1)
{
for(Y=N;Y<width-N;Y++)
{
*((
int *)matrix+X*width+Y) =
count--;
if(
count <=
0)
{
finish =
true;
break;
}
}
Y-=
1;
if(finish)
break;
for(X=M+
1;X<height-M;X++)
{
*((
int *)matrix+X*width+Y) =
count--;
if(
count <=
0)
{
finish =
true;
break;
}
}
X-=
1;
if(finish)
break;
for(Y=Y-
1;Y>=N;Y--)
{
*((
int *)matrix+X*width+Y) =
count--;
if(
count <=
0)
{
finish =
true;
break;
}
}
N++;
Y+=
1;
if(finish)
break;
for(X=X-
1;X>M;X--)
{
*((
int *)matrix+X*width+Y) =
count--;
if(
count <=
0)
{
finish =
true;
break;
}
}
M++;
X+=
1;
if(finish)
break;
}
for(
int i=
0;i<height;i++)
{
for(
int j=
0;j<width;j++)
printf(
"-\t",matrix[i][j]);
printf(
"\n");
printf(
"\n");
}
}
void test_z_spin(
int width,
int height)
{
int matrix[height][width]={
0};
int total = width * height;
int maxstep=min(width,height)-
1;
int count =
1;
int x =
0;
int y =
0;
int step =
0;
while(
1)
{
matrix[x][y]=
count;
matrix[height-
1-x][width-
1-y]=total-
count+
1;
if(x+
1<height)
x++;
else
y++;
count++;
if(
count>(total+
1)/
2)
break;
step++;
if(step>=maxstep)
step = maxstep;
for(
int i =
0;i<step;i++)
{
matrix[x][y]=
count;
matrix[height-
1-x][width-
1-y]=total-
count+
1;
x--;
y++;
count++;
if(
count>(total+
1)/
2)
break;
}
if(
count>(total+
1)/
2)
break;
matrix[x][y]=
count;
matrix[height-
1-x][width-
1-y]=total-
count+
1;
if(y+
1<width)
y++;
else
x++;
count++;
if(
count>(total+
1)/
2)
break;
step++;
if(step>=maxstep)
step = maxstep;
for(
int i =
0;i<step;i++)
{
matrix[x][y]=
count;
matrix[height-
1-x][width-
1-y]=total-
count+
1;
x++;
y--;
count++;
if(
count>(total+
1)/
2)
break;
}
if(
count>(total+
1)/
2)
break;
}
for(
int i =
0;i<height;i++)
{
for(
int j=
0;j<width;j++)
{
printf(
"-\t",matrix[i][j]);
}
printf(
"\n");
printf(
"\n");
}
}
int main()
{
int width =
0;
int height =
0;
while(
1)
{
printf(
"please input the width and height:");
scanf(
"%d %d",&width,&height);
printf(
"内螺旋矩阵为:\n");
test_inside_spin(width,height);
printf(
"外螺旋矩阵为:\n");
test_outside_spin(width,height);
printf(
"Z螺旋矩阵为:\n");
test_z_spin(width,height);
}
}