#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[N][N];
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;
}
贯穿10*10数组的随机步
最新推荐文章于 2023-02-18 13:04:27 发布