首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C/C++ 螺旋队列,该怎么解决

2012-03-09 
C/C++ 螺旋队列21 23 23 24 25 .....20 7891019 6121118 5431217 16 15 14 13怎样生成这样的螺旋数?我想了

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;} 

热点排行