キューに基づくBFSラビリンス解決アルゴリズムの実装

アルゴリズムのアイデア

幅優先探索アルゴリズムの基本的な考え方は、初期状態Sから始めて、ルールを使用して次の可能な状態を生成することです。ツリーの次のレベルを形成するには、出口Gが表示されるかどうかを確認します。表示されない場合は、このレベルのすべての状態ノードのルールを順番に使用します。ターゲットの状態が表示されるまで、次のレベルですべての状態ノードを生成します。

プログラムの実現

  1. 構造と関連する配列を定義する
int head, rear, size = 0, num = 0;
typedef struct node {
    
    
	int x, y;
	struct node *next;
} node_t;

node_t b[N], way[N]; //队列b,和记录路径坐标的结构体数组

int a[N][N]; //构造地图
  1. 最短経路を印刷
void print_path() {
    
    
	int i;
	for(i = num - 1 ; i >= 0 ; i--) {
    
    
		printf("(%d, %d)\n", way[i].x, way[i].y);
	}
}
  1. 簡単に検索できるように、マップ全体を1で囲みます
void surround() {
    
    
	int i , j ;
	for(i = 0 ; i< size + 2 ; i++) {
    
    
		for(j = 0 ; j < size + 2 ; j++) {
    
    
			if(i == 0 || i == size + 1 || j == 0 || j == size + 1) {
    
    
				a[i][j] = 1;
			}
		}
	}
}
  1. キューを初期化する
void init() {
    
    
	head = 0;
	rear = 0;
}
  1. ポップアップキューのメンバー
node_t *pop() {
    
    
	node_t *p;
	p = &b[head];
	head++;
	return p;
}
  1. 過去のポイント情報をキューに追加し、次は前のノードデータへのポインター
void record(int x ,int y ,node_t * next) {
    
    
	b[rear].x = x;
	b[rear].y = y;
	b[rear].next =next;
	rear++;
}
  1. 地図を横断して道を見つける
void travel() {
    
    
	node_t *temp;
	record(1, 1, NULL);
	while(1) {
    
    
		if(head >= rear) return;//当队头和队尾相等时,退出
		temp = pop();
		//当走到终点时,用way数组又保存返回到起点的路径
		if(temp -> x == size && temp->y == size) {
    
    
			//将第一个数据的next指针指向空,作为返回起点的终止条件。
			while(temp != NULL) {
    
    
				way[num].x = temp->x - 1;
				way[num].y = temp->y - 1;
				num++;
				temp = temp->next;
			}
			return;
		}
		//遍历四个方向,只要满足条件,就加入队列
		if(a[temp->x][temp->y - 1] != 1) {
    
    
			record(temp->x, temp->y - 1, temp);
			a[temp->x][temp->y - 1] = 1;
		}
		if(a[temp->x][temp->y + 1] != 1) {
    
    
			record(temp->x ,temp->y + 1 ,temp);
			a[temp->x][temp->y + 1] = 1;
		}
		if(a[temp->x - 1][temp->y] != 1) {
    
    
			record(temp->x - 1 ,temp->y, temp);
			a[temp->x - 1][temp->y] = 1;
		}
		if(a[temp->x + 1][temp->y] != 1) {
    
    
			record(temp->x + 1, temp->y, temp);
			a[temp->x + 1][temp->y] = 1;
		}
	}
}
  1. 主な機能
int main() {
    
    
	printf("请输入一个N*N的迷宫大小N:");
	scanf("%d", &size);
	memset(a, 0, sizeof(a));
	int i, j;
	printf("请输入迷宫内部构造(0表示通路,1表示墙壁):\n");
	for(i = 1 ; i < size + 1 ; i ++) {
    
    
		for(j = 1 ; j < size + 1; j++) {
    
    
			if(scanf("%d", &a[i][j]) == EOF) {
    
    
				return 0;
			}
		}
	}
	surround();
	init();
	travel();
	print_path();
	return 0;
}

演算結果

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43405938/article/details/108692345
おすすめ