您的位置:首页 > 其它

贯穿10*10数组的随机步

2016-03-09 14:29 239 查看
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10     //定义地图 10*10
#define NUM_direction 4 // 4个方向
#define TRUE 1
#define FALSE 0

void answer();
int Is_over(int i, int j);      //越界判断
void move(int * i, int * j, int direction);  //移动
int Test_direction(int a[], int n);          //判断4个方向是否都不通
int main() {
answer();
fflush(stdin);
getchar();
return 0;
}

void answer() {
char all

;
int flag_direction[NUM_direction]={0}; //1表示不通
int cur_i=0,cur_j=0;   //cur_i是行,cur_j是列,{0,0}是入口
int pre_i,pre_j;
int cur_direction;     //每次随机产生的方向
char cur_step='A';   //初始步是‘A’
int i,j;
for(i=0;i<N;++i) {
for(j=0;j<N;++j) {
all[i][j]='*';
}
}
all[0][0]=cur_step;
srand((unsigned) time(NULL));
while(Test_direction(flag_direction, NUM_direction) && 'Z'!=cur_step) {     //不是最后一步,也不是4个方向都不通
cur_direction= rand()%4;
if(flag_direction[cur_direction]) {
continue;
}
pre_i=cur_i;
pre_j=cur_j;
move(&cur_i,&cur_j,cur_direction);     //先走再判断,如果不合格则后退
if(Is_over(cur_i,cur_j) || '*'!=all[cur_i][cur_j] ) { //是边界 或者 已经走过
flag_direction[cur_direction]=1;            //标识此方向不通
cur_i=pre_i;                                //后退一步
cur_j=pre_j;
continue;
}
cur_step++;                                //前进一步
all[cur_i][cur_j]=(char) cur_step;
for(i=0;i<NUM_direction;++i) {
flag_direction[i]=0;
}
}

for(i=0;i<N;++i) {
for(j=0;j<N;++j) {
printf("%c ",all[i][j]);
}
printf("\n");
}
}

int Is_over(int i ,int j) {  //是否越界
if(i>=0 && i<N && j>=0 && j<N ) {
return FALSE;
}
else {
return TRUE;
}
}
void move (int * i, int * j, int direction) {
if(0==direction) {   //向上
*i=*i -1;
}
else if(2==direction) {   //向下
*i=*i +1;
}
else if(1==direction) {   //向右
*j=*j+1;
}
else if (3==direction) {   //向左
*j=*j-1;
}
}

int Test_direction(int a[], int n) {
int i;
int sum=0;
for(i=0;i<n;++i) {
sum+=a[i];
}

return sum==4 ? FALSE:TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: