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;
}
for(irow = 0; irow < isize; irow++){
for(icol = 0; icol < isize; icol++) printf("%4d ", iarr[irow * isize + icol]);
printf("\n");
}
system("pause");
return 0;
}