Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)

Résumé de l'article

Il s'agit d'une série d'articles que j'ai compilés dans mon étude et mon mémo. Le troisième. Ceci est une suite de cet article. Introduction aux algorithmes avec java --Search (recherche prioritaire en profondeur) Dans cet article

Je vais étudier sur.

Recherche de priorité de largeur

Il est également appelé BFS (recherche en largeur d'abord). (Largeur: largeur) J'écrirai ceci pendant mes études. Pour connaître la différence par rapport à la recherche de priorité de profondeur qui ressemble à un arbre, consultez cet article «Introduction aux algorithmes avec java-Search (Depth Priority Search)» S'il te plait donne moi.

Il semble être efficace pour des problèmes tels que la recherche de l'itinéraire le plus court d'un labyrinthe.

Il semble qu'une structure de données appelée file d'attente soit utilisée comme méthode de mise en œuvre. Recherche prioritaire approfondie, pile "premier entré, dernier sorti", Gardez à l'esprit que les recherches en largeur d'abord utilisent des files d'attente "premier entré, premier sorti".

De plus, la recherche de priorité en profondeur pourrait être mise en œuvre par récursive, mais il semble qu'elle soit impossible ou difficile à traiter dans l'ordre de la file d'attente si elle est récursive. Utilisez-vous la file d'attente? .. Je ne veux pas me souvenir de nouvelles bibliothèques ou types au début de mes études. .. .. Je n'ai pas l'impression de pouvoir l'utiliser tout de suite. ..

À propos, des piles et des files d'attente apparaîtront dans l'examen d'ingénieur de l'information de base, donc je pense que ça va, mais je ne sais pas! Pour ceux qui disent, cet article "Piles et files d'attente extrêmes! ~ Dossier spécial sur les idées et utilisations ~" semble être facile à comprendre, alors étudiez-le. Faisons le.

Pour le moment, l'exemple est facile à comprendre Dernière fois J'ai pensé essayer arc031-b implémenté dans DFS, mais il peut ne pas convenir à BFS. Je vais donc essayer un autre exemple.

Exemple: AtCoder --agc033-a "Darker and Darker"

Cliquez ici pour afficher des phrases de problème et des exemples de saisie
* Veuillez vous référer au lien de problème autant que possible

(Début de section) 【Énoncé du problème】 On lui donne des carrés noirs et blancs avec H lignes verticalement et W colonnes horizontalement. L'état des carrés est représenté par des caractères HW de A11 à AHW. Lorsque les carrés de la i-ième ligne à partir du haut et de la j-ème colonne à gauche sont noirs, Aij est #, la i-ème ligne à partir du haut et j à partir de la gauche. Aij est. Lorsque les cellules de la colonne sont blanches.

Répétez les opérations suivantes jusqu'à ce que toutes les cellules soient noires. Toutes les cellules blanches qui partagent un côté et ont une ou plusieurs cellules noires dans les cellules adjacentes deviennent noires. Découvrez combien d'opérations vous allez effectuer. Cependant, il y a au moins une cellule noire dans la première cellule donnée.

[Restrictions] 1≦H,W≦1000 Aij est # ou .. Il y a au moins une cellule noire dans la cellule donnée.

【contribution】 L'entrée est donnée à partir de l'entrée standard dans le format suivant.

H W
A11 A12 ... A1W
:
AH1 AH2 ... AHW

【production】 Sortez le nombre d'opérations effectuées.

(Fin de la section)


[Exemple de réponse]

main.java


import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		// height
		int h = sc.nextInt();

		// width
		int w = sc.nextInt();

		//État des carrés
		char[][] masu = new char[h][w];

		//Préparer la file d'attente BFS
		Deque<XY> q = new ArrayDeque<>();

		//Recevoir des entrées& '#'EnQueue
		for (int i = 0; i < h; i++) {
			masu[i] = sc.next().toCharArray();
			for (int j = 0; j < w; j++) {
				if ('#' == masu[i][j]) {
					q.add(new XY(i, j, 0));
				}
			}
		}

		// ans
		int max_depth = 0;

		//Traitement principal BFS
		for (;;) {
			//Début de boucle infinie

			//Conditions de sortie
			if (q.size() < 1) {
				break;
			}

			//file d'attente pour retirer la file d'attente
			//méthode de sondage récupère de la file d'attente&Supprimer de la file d'attente
			XY xy = q.poll();
			int x = xy.x;
			int y = xy.y;
			int depth = xy.depth;

			//Enregistrer le nombre d'opérations
			if (depth >= max_depth) {
				max_depth = depth;
			}

			//Rendre la zone autour de la position actuelle noire
			if (x + 1 < w && masu[y][x + 1] == '.') {
				//Carré droit
				masu[y][x + 1] = '#';
				q.add(new XY(y, x + 1, depth + 1));
			}
			if (x - 1 >= 0 && masu[y][x - 1] == '.') {
				//Carré gauche
				masu[y][x - 1] = '#';
				q.add(new XY(y, x - 1, depth + 1));
			}
			if (y + 1 < h && masu[y + 1][x] == '.') {
				//Carré inférieur
				masu[y + 1][x] = '#';
				q.add(new XY(y + 1, x, depth + 1));
			}
			if (y - 1 >= 0 && masu[y - 1][x] == '.') {
				//Carré supérieur
				masu[y - 1][x] = '#';
				q.add(new XY(y - 1, x, depth + 1));
			}

		}

		System.out.println(max_depth);

	}
}

class XY {
	int y;
	int x;

	int depth;

	XY(int y, int x, int d) {
		this.x = x;
		this.y = y;
		depth = d;
	}
}

C'est comme ça. La politique est la suivante.

--Dans l'état initial, placez les informations du carré noir dans la file d'attente. (Coordonnées, combien de fois il est devenu noir (= profondeur))

Dans cet ordre, les profondeurs sont toujours 0, 1, 2 ... et elles entrent dans la file d'attente dans l'ordre, donc la profondeur quand elle devient noire est la profondeur minimale de ce carré, donc une fois qu'il devient noir, c'est OK. Je suis reconnaissant pour cela.

À propos, est-ce une variante de la recherche de priorité de largeur ou est-il classé comme un type de BFS avec plusieurs points de départ? Cela semble être fait.

J'ai appris à utiliser la file d'attente plutôt que la recherche de priorité de largeur. Lol Je pense que j'utilise beaucoup la méthode de sondage de Deque, donc je veux vraiment m'en souvenir.

J'aimerais voir visuellement le mouvement lors de sa mise en œuvre avec la recherche de priorité de largeur cette fois-ci, mais comme j'ai appris de l'article précédent (je pensais que vous pouvez le comprendre, w) je vais m'arrêter. ** J'ai écrit des commentaires dans le code d'une manière facile à comprendre, veuillez donc les suivre. ** **

Si cela est écrit pour le moment, il semble que l'application fonctionnera. Le reste est un exercice problématique. Après avoir appris la théorie, pratiquez-la à plusieurs reprises et installez-vous en vous-même. Je veux suivre les chiffres.


C'est tout pour cette fois. La prochaine fois, je parlerai de la recherche peu complète. impatient de!

Recommended Posts

Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
Introduction aux algorithmes avec java --Search (bit full search)
Introduction aux algorithmes avec java-Search (recherche complète, recherche de bisection)
Introduction aux algorithmes avec la méthode java-Shakutori
[Java] Introduction à Java
Introduction à Java
Introduction à la commande java
Java pour jouer avec Function
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
[Java] Introduction à l'API Stream
[Introduction aux jeux Janken (comme)] Java
Java pour apprendre avec les ramen [Partie 1]
BDD Java 100% pur avec JGiven (Introduction)
[Introduction à Java] À propos des expressions lambda
[Java] Points à noter avec Arrays.asList ()
[Introduction à Java] À propos de l'API Stream
Introduction à la programmation fonctionnelle (Java, Javascript)
Osez défier Kaggle avec Java (1)
Introduction initiale à Mac (ingénieur Java)
Traitement serveur avec Java (Introduction partie 1)
Java, des tableaux pour débuter avec les débutants
Recherche de priorité de largeur AtCoder ABC 136 D résolue en Ruby, Perl et Java
[Java] Introduction
Comment compiler Java avec VsCode & Ant
[Introduction à Java] Comment écrire un programme Java
Ajouter un document à Azure Search Service (Java)
Sortie du livre "Introduction à Java"
Introduction à la surveillance à partir de Java Touching Prometheus
[Introduction à Java] À propos des déclarations et des types de variables
Facile à parcourir avec les expressions régulières Java
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
Introduction à la bataille de robots avec Robocode (construction d'environnement)
[Java] Comment tester s'il est nul dans JUnit
J'ai essayé de faire une authentification de base avec Java
[Introduction à Java] À propos de la conversion de type (distribution, promotion)
Méthode de recherche
Essayez d'intégrer Ruby et Java avec Dapr
Ingénieur en route vers Java Partie 1 Introduction et construction de l'environnement
Comment utiliser le framework Java avec AWS Lambda! ??
Pour mon fils qui a commencé à étudier Java avec "Introduction à Java" dans une main
[Mensuel 2017/04] Introduction à groovy !! ~ Comparaison de grammaire / spécification Java ~
Je veux utiliser java8 forEach avec index
Introduction à web3j
Comment utiliser l'API Java avec des expressions lambda
[Java] Obtenez des images avec l'API Google Custom Search
Introduction à Micronaut 1 ~ Introduction ~
Premiers pas avec Kotlin à envoyer aux développeurs Java
Introduction à la migration
Essayez d'implémenter TCP / IP + NIO avec JAVA
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Mesurez la distance du labyrinthe avec la recherche de priorité de largeur
Facile à créer LINE BOT avec Java Servlet
Introduction à Doma