c语言编程求星号问题,c语言编程 求助!!

满意答案

// 回形遍历数组.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分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值