C/C++ 螺旋队列
21 23 23 24 25 .....
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
怎样生成这样的螺旋数?我想了半天,用了个蹩脚的办法:
a[0][4] a[0][3] a[0][2] a[0][1] a[0][0] <<<<<<HEAD(25)
a[1][4] a[1][3] a[1][2] a[1][1] a[1][0]
a[2][4] a[2][3] a[2][2] a[2][1] a[2][0]
a[3][4] a[3][3] a[3][2] a[3][1] a[3][0]
a[4][4] a[4][3] a[4][2] a[4][1] a[4][0]
我这样用二维数组编号,然后从25开始存放,按数字一次递减:
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
a[1][4] a[2][4] a[3][4] a[4][4]
a[4][3] a[4][2] a[4][1] a[4][0]
a[3][0] a[2][0] a[1][0]
a[1][1] a[1][2] a[1][3]
a[2][3] a[3][3]
a[3][2] a[3][1]
a[2][1]
a[2][2]
设a[i][j]的话,就这里有点小规律,先是j加,然后i加,然后j减,然后i减,一直到原点,就是1(a[2][2])
我蹩脚的代码:[code=C/C++][/code]
int size=5; /*must be and odd number*/
int origin;
typedef int (*linear_array_add)[5]; /*the pointer of linear array*/
linear_array_add screw_queue(void)
{
int i=0;
int j=0;
int max=size*size;
int time;
linear_array_add add;
add=(linear_array_add)malloc(size*size);
/*fill in the screw queue*/
origin=size/2;
for(time=0; time<(size/2+1); time++)
{
for(j=time; j<size-time; j++) /* j++ */
add[i][j]=max--;
for(i=time+1,j--; i<size-time; i++) /* i++ */
add[i][j]=max--;
for(j=size-2-time,i--; j>=time; j--) /* j-- */
add[i][j]=max--;
for(i=size-2-time,j++; i>=time+1; i--) /* i-- */
add[i][j]=max--;
i++;
if(i == origin && j == origin)
break;
}
return add;
}
各位有什么高见????
[解决办法]
- C/C++ code
#include <stdio.h>#include <malloc.h>void helix(int start, int d, int n, int **arr, int line){ int i, j; if(d <= 0) { if(line % 2 != 0) arr[start][start] = ++n; return; } i = start; for(j = start; j < start + d; ++j) arr[i][j] = ++n; for(; i < start + d; ++i) arr[i][j] = ++n; for(; j > start; --j) arr[i][j] = ++n; for(; i > start; --i) arr[i][j] = ++n; d -= 2; helix(++start, d, n, arr, line);}int main(){ int n = 4, i, j; int **array; array = (int**)malloc(sizeof(int*)*n); for(i = 0; i < n; ++i) array[i] = (int*)malloc(sizeof(int)*n); helix(0, n-1, 0, array, n); for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) printf("%5d", array[i][j]); printf("\n"); } for(i = 0; i < n; ++i) free(array[i]); free(array); return 0;}
[解决办法]
我的想法是考虑状态轮换,→↓←↑,再加上边界判断...只能解决正方形矩阵,对于长方形的貌似判断无力..
- C/C++ code
#include <iostream>using namespace std;#define WIDTH 15#define HEIGHT 15enum{ TO_RIGHT = 1, TO_DOWN = 2, TO_LEFT = 3, TO_UP = 4,} Status;void MakeCircle(int *pArray, int nWidth, int nHeight, int nXstart, int nYstart){ switch(Status) { case TO_RIGHT: if (pArray[nYstart*nWidth + nXstart + 1] == 0 && nXstart + 1 <= nWidth) { pArray[nYstart*nWidth + nXstart + 1] = pArray[nYstart*nWidth + nXstart] + 1; Status = TO_DOWN; nXstart++; } else if (nYstart - 1 >= 0) { Status = TO_UP; } else { return; } break; case TO_DOWN: if (pArray[(nYstart+1)*nWidth + nXstart] == 0 && nYstart+1 <= nHeight) { pArray[(nYstart+1)*nWidth + nXstart] = pArray[nYstart*nWidth + nXstart] + 1; Status = TO_LEFT; nYstart++; } else if (nXstart + 1 <= nWidth) { Status = TO_RIGHT; } else { return; } break; case TO_LEFT: if (pArray[nYstart*nWidth + nXstart -1] == 0 && nXstart + 1 <= nWidth) { pArray[nYstart*nWidth + nXstart -1] = pArray[nYstart*nWidth + nXstart] + 1; Status = TO_UP; nXstart--; } else if (nYstart + 1 <= nHeight) { Status = TO_DOWN; } else { return; } break; case TO_UP: if (pArray[(nYstart-1)*nWidth + nXstart] == 0 && nYstart - 1 >= 0) { pArray[(nYstart-1)*nWidth + nXstart] = pArray[nYstart*nWidth + nXstart] + 1; Status = TO_RIGHT; nYstart--; } else if (nXstart - 1 >= 0) { Status = TO_LEFT; } else { return; } break; } MakeCircle(pArray, nWidth, nHeight, nXstart, nYstart);}int main(void){ int *Matrix; Matrix = new int[HEIGHT*WIDTH]; memset(Matrix, 0, HEIGHT*WIDTH*sizeof(int)); Status = TO_RIGHT; Matrix[HEIGHT/2*WIDTH + WIDTH/2] = 1; MakeCircle(Matrix, WIDTH, HEIGHT, WIDTH/2, HEIGHT/2); for (int i = 0; i < HEIGHT; i ++) { for (int j = 0; j < WIDTH; j++) { cout.width(3); cout.fill(' '); cout << Matrix[i*WIDTH + j] << " "; } cout << endl; } delete []Matrix; return 0;}
[解决办法]
- C/C++ code
#include <stdio.h>#include <stdlib.h> const int isize = 10; //可以修改该值定义数据区域的大小 typedef enum {d_left, d_right, d_up, d_down} Dir;int main(){ int ibeginpos = 0, iloop = 0, irow = (isize - 1) / 2, icol = (isize - 1) / 2; Dir m_dir = d_right; int *iarr = (int *)malloc(sizeof(int) * isize * isize); memset(iarr, 0, sizeof(int) * isize * isize); iarr[irow * isize + icol] = 1; //fill for(iloop = 2; iloop <= isize * isize; iloop++){ switch(m_dir){ case d_left: { icol--; if(iarr[(irow - 1) * isize + icol] ==0) m_dir = d_up; }break; case d_right: { icol++; if(iarr[(irow + 1) * isize + icol] ==0) m_dir = d_down; }break; case d_up: { irow--; if(iarr[irow * isize + icol + 1] ==0) m_dir = d_right; }break; case d_down: { irow++; if(iarr[irow * isize + icol - 1] ==0) m_dir = d_left; }break; } iarr[irow * isize + icol] = iloop; } //print for(irow = 0; irow < isize; irow++){ for(icol = 0; icol < isize; icol++) printf("%4d ", iarr[irow * isize + icol]); printf("\n"); } system("pause"); return 0;}