螺旋矩阵算法代码实现

贴这个实在不好意思,因为计算机专业课就有这个题目,不过时间太久了,都忘了,前两天看到论坛中有人问起这个,就想了想,既然写了就贴出来。想到的有两种办法,一种是根据坐标x,y,计算坐标的值value;另外一种是根据值value,计算坐标的值x,y。

第一种:

void matrix1(int W, int H) { if (W <= 0 || H <= 0) return; int x,y,level,max,w,h,pos; printf("Matrix1/n"); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { x = (j < (W - j - 1)) ? j : (W - j - 1); //离边的距离 y = (i < (H - i - 1)) ? i : (H - i - 1); level = (x < y) ? x : y; //计算j,i所在的框的层 max = 0; //框外的最大值 for (int l = 0; l < level; l++) { max += 2 * (W - 2 * l - 1) + 2 * (H - 2 * l - 1); } x = j - level; //当前框下的坐标 y = i - level; w = W - 2 * level; //当前框宽度 h = H - 2 * level; //当前框高度 pos = 0; if (y == 0) { pos = x + 1; //上 } else if (x == w - 1) { pos = w + y; //右 } else if (y == h - 1) { pos = w - 1 + h - 1 + w - x; //下 } else if (x == 0) { pos = w - 1 + h - 1 + w - 1 + h - y; //左 } int value = max + pos; //加上外框值 printf("%d/t", value); } printf("/n"); } }

第二种:

void matrix2(int W, int H) { int arr[W][H]; //数组 int w,h; //当前长/宽 int begin = 0; //起始值 int level = 0; //当前级 int i; //当前值 int x, y; //坐标 for (int I = 1; I <= W * H; I++) { i = I - begin; w = W - 2*level; h = H - 2*level; if (i < w ) { //上 x = i - 1; y = 0; } else if (i < w + h - 1) { //右 x = w - 1; y = i - w; } else if (i < 2 * w + h - 2) { //下 x = (2 * w + h - 2) - i; y = h -1; } else if (i < 2 * (w + h) - 3) { //左 x = 0; y = 2 * (w + h) - 3 - i; } x = x + level; y = y + level; arr[x][y] = I; if( i == 2 * (w + h -2 ) ){ begin += 2 * (w + h -2); level ++; } } printf("Matrix2/n"); for(y = 0; y < H; y++){ for(x = 0; x < W; x++){ printf("%d/t",arr[x][y]); } printf("/n"); } }

 

当然其他的办法,我估计还有,比如从最大值开始寻找坐标,或者有什么办法折叠。

 

 

你可能感兴趣的:(算法,Matrix)