/*************************************************************************
> File Name: test_spin.cpp
> Author: lijun
> Mail: 2291042162@qq.com
> Created Time: 2017年08月31日 星期四 16时03分08秒
************************************************************************/
/*
螺旋矩阵
*/
#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("%2d\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("%2d\t",matrix[i][j]);
printf("\n");
printf("\n");
}
}
//有点小bug 比如 width = 3 height = 6
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;
//turn down
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;
//turn right_up
x--;
y++;
count++;
if(count>(total+1)/2)
break;
}
if(count>(total+1)/2)
break;
//turn right
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;
//turn left_down
x++;
y--;
count++;
if(count>(total+1)/2)
break;
}
if(count>(total+1)/2)
break;
}
//print
for(int i =0;i<height;i++)
{
for(int j=0;j<width;j++)
{
printf("%2d\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);
}
}
螺旋矩阵
最新推荐文章于 2024-09-24 16:24:36 发布