满意答案
// 回形遍历数组.cpp : Defines the entry point for the console application.
//
#include
#include
//定义各个方向移动时row,col的变化值
const int dir_steps [][2] = {
{
0,0
},
{
1,0
},
{
0,1
},
{
-1,0
},
{
0,-1
}
};
//移动方向
typedef enum
{
_NULL,
RIGHT,
DOWN,
LEFT,
UP
}DIRECTION;
typedef struct
{
int row;
int col;
}POSITION,*PPOSITION;
#define NEXT_ROW(pos,dir) ((pos)->row+dir_steps[(dir)][1])
#define NEXT_COL(pos,dir) ((pos)->col+dir_steps[(dir)][0])
//转向顺序
DIRECTION turnNext(DIRECTION curDir)
{
switch (curDir)
{
case RIGHT:
return DOWN;
case DOWN:
return LEFT;
case LEFT:
return UP;
case UP:
return RIGHT;
default:
return _NULL;
}
}
//获得下一次移动的方向,如果返回_NULL,说明遍历结束
DIRECTION MoveNext( DIRECTION curDirection,POSITION *curPos, int **flagArray)
{
DIRECTION dir = _NULL;
int i = NEXT_ROW(curPos,curDirection);
int j = NEXT_COL(curPos,curDirection);
i=flagArray[i][j];
if (flagArray[NEXT_ROW(curPos,curDirection)][NEXT_COL(curPos,curDirection)] != 0)
{
dir = turnNext(curDirection);
if (flagArray[NEXT_ROW(curPos,dir)][NEXT_COL(curPos,dir)] != 0)
{
dir = _NULL;
}
}
else
dir = curDirection;
if (_NULL != dir)
{
curPos->row = NEXT_ROW(curPos,dir);
curPos->col = NEXT_COL(curPos,dir);
flagArray[curPos->row][curPos->col] = 1;
}
return dir;
}
int main(int argc, char* argv[])
{
int **flagArray,**dataArray;
int row,col;
int i,j;
int bFlag;
DIRECTION initDir;
POSITION initPos;
bFlag = 0;
//输入row ,col
printf("请输入row(0
while(!bFlag)
{
scanf("%d%d",&row,&col);
if (00 && col<100)
{
bFlag = 1;
}
}
//分配内存
flagArray = (int**)malloc(sizeof(int)*(row+2));
dataArray = (int**)malloc(sizeof(int)*row);
for (i=0;i
{
flagArray[i] = (int*)malloc(sizeof(int)*(col+2));
if(i
dataArray[i] = (int*)malloc(sizeof(int)*col);
}
//设置标志数组,做一个围墙:D
for (i=0;i
{
for (j=0;j
{
if (0==i || i==row+1 || 0==j || j==col+1)
{
flagArray[i][j] = 1;
}
else
flagArray[i][j] = 0;
}
}
//输入原始数据
for (i=0;i
{
printf("请输入第%d行数,每行%d个数:\r\n",i+1,col);
for (j=0;j
{
scanf("%d",&dataArray[i][j]);
}
}
//
printf("输出原数组:\r\n");
for (i=0;i
{
for (j=0;j
{
printf("%d\t",dataArray[i][j]);
}
printf("\r\n");
}
//
//遍历输出数组;
initDir = RIGHT;
initPos.row = 1;
initPos.col = 0;
printf("输出遍历数组:\r\n");
for (i=0;i
{
initDir = MoveNext(initDir,&initPos,flagArray);
if (_NULL == initDir) //遍历结束
{
printf("\r\n遍历结束\r\n");
}
else
{
printf("%d\t",dataArray[initPos.row-1][initPos.col-1]);
}
}
for (i=0;i
{
free(flagArray[i]);
if(i
free(dataArray[i]);
}
free(flagArray);
free(dataArray);
printf("\r\n");
return 0;
}
00分享举报