質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

840閲覧

迷路の穴掘り法に関する質問

SS_K

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/28 16:53

前提・実現したいこと

Pythonで穴掘り法を使って、迷路を作っているのですが、なぜ穴掘り法で作った迷路には一つしか答えがないのでしょうか。

発生している問題・エラーメッセージ

'''
エラーはないのですが、迷路を解決するコードを作りたいと思っています。
'''

該当のソースコード

Python
'''
import random

class Laby():
""" Classe labyrinthe """
chemin = 0
mur = 1
def init(self, l, h):
self.laby = []
self.l = l
self.h = h
if(self.h < 5 or self.l < 5):
print('donnes-moi un chiffre supérieur à 5')
exit()
if (self.l % 2) == 0:
self.l = self.l + 1
if (self.h % 2) == 0:
self.h = self.h + 1

class CreuserLaby(Laby):
poubelle = []
def set_inner_mur_creuser_point(self):
""" Préparation avant de creuser un trou"""
for x in range(0, self.l):
ligne = []
for y in range(0, self.h):
if (x == 0 or y == 0 or x == self.l-1 or y == self.h -1):
case = self.chemin
else:
case = self.mur
ligne.append(case)
self.laby.append(ligne)
x_depart_creuser = random.randrange(1, self.l-1, 2)
y_depart_creuser = random.randrange(1, self.h-1, 2)
self.laby[x_depart_creuser][y_depart_creuser] = self.chemin
self.poubelle.append([x_depart_creuser, y_depart_creuser])

def creuse_laby(self): """ Creuser le trou """ while True: if self.poubelle == []: break x, y = self.poubelle.pop(random.randrange(0, len(self.poubelle))) while True: lst_direction_creuser = [] if self.laby[x][y-1] == self.mur and self.laby[x][y-2] == self.mur: lst_direction_creuser.append('bas') elif self.laby[x+1][y] == self.mur and self.laby[x+2][y] == self.mur: lst_direction_creuser.append('droite') elif self.laby[x][y+1] == self.mur and self.laby[x][y+2] == self.mur: lst_direction_creuser.append('haut') elif self.laby[x-1][y] == self.mur and self.laby[x-2][y] == self.mur: lst_direction_creuser.append('gauche') if lst_direction_creuser == []: break else: direction_creuser = random.choice(lst_direction_creuser) if direction_creuser == 'bas': self.laby[x][y-1] = self.chemin self.laby[x][y-2] = self.chemin self.poubelle.append([x, y-2]) elif direction_creuser == 'droite': self.laby[x+1][y] = self.chemin self.laby[x+2][y] = self.chemin self.poubelle.append([x+2, y]) elif direction_creuser == 'haut': self.laby[x][y+1] = self.chemin self.laby[x][y+2] = self.chemin self.poubelle.append([x, y+2]) elif direction_creuser == 'gauche': self.laby[x-1][y] = self.chemin self.laby[x-2][y] = self.chemin self.poubelle.append([x-2, y]) def set_outer_mur_start_goal(self): for x in range(0, self.l): for y in range(0, self.h): if (x == 0 or y == 0 or x == self.l-1 or y == self.h -1): self.laby[x][y] = self.mur self.laby[0][1] = 'S' self.laby[self.l-2][self.h-1] = 'G' def print_laby(self): self.set_inner_mur_creuser_point() self.creuse_laby() self.set_outer_mur_start_goal() for ligne in self.laby: for case in ligne: if case == self.chemin: print(' ', end ='') elif case == self.mur: print('???? ' ,end='') elif case == 'S': print(' ', end='') elif case == 'G': print(' ', end='') print()

laby_creuser = CreuserLaby(20, 20)
laby_creuser.print_laby()
'''

試したこと

穴掘り法を使って作った迷路は一つしか答えがないことを分かっていたので、self.laby[0][1]を利用してコードを作ろうと思いましたが、無理でした。

補足情報(FW/ツールのバージョンなど)

##フランス語で書いたコードなので翻訳
self.l は横
self.h は高さ
creuser やCreuse は掘る
self.chemin は道でself.mur は壁となっています。
LABY やlabyrinthe は迷路を指します。
poubelle はもうすでに通った道を貯めておく(?)リストです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スタートとゴールが一つずつの時、複数のルートでスタートからゴールにたどり着けるなら閉路があるということです。
既存の通路と合流しないように通路を掘っていけば閉路はできないのでルートは一つしかありません。

ところでそのコードは質問に関係があるんですか?

投稿2021/05/28 17:20

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SS_K

2021/05/28 17:30

もう一つ、迷路に関する質問をしようと思って迷路を作ったコードを間違って足してしまいました!この質問には関係ないです!すいませんm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問