螺旋矩阵

xiaoxiao2021-02-28  124

/************************************************************************* > 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("-\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"); } } //有点小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("-\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); } }

转载请注明原文地址: https://www.6miu.com/read-44583.html

最新回复(0)