貫穿10*10數組的隨機步

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章