c语言用偶数打印螺旋队列,C/C++ 螺旋队列,该怎么解决

C/C++ code#include

using namespace std;

#define WIDTH 15

#define HEIGHT 15

enum{

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

#include

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值