LeetCodeのバックトラッキングアルゴリズム

アルゴリズムの概要:
バックトラッキング(探索とバックトラッキング)は一種の最適な検索方法であり、ヒューリスティック法とも呼ばれ、最適な条件に従って前方に検索して目標を達成します。ただし、特定のステップを探索すると、元の選択が適切でないか、目標に達していないことがわかり、1つのステップが返されて再選択されます。この戻りと戻るという手法は、遡及的な方法であり、遡及条件を満たす状態の特定のポイントです。これは「バックトラックポイント」と呼ばれます。

固有表現:バックトラック方式は、異なるフォークを選択して宛先を1つずつ検索することで宛先を見つけることと理解できます。間違った方向に進んだ場合は、目的地が見つかるまで、交差点にある別の道路を探して戻ります。

定義によると、バックトラッキングを実現するには、2つのポイントと1つの検索が必要です2つの解空間
解空間は、配列[a1、a2、...、an]のようなベクトルです。このベクトルの各要素は、問題の部分的な解決策です。この配列の各要素が満たされた場合(すべての解決策を取得するため)にのみ、問題が解決されたことが示されます。したがって、ほとんどすべてのバックトラック問題の難しさは、ソリューションスペースの定義方法にあります。
次のテンプレートは、すべての「バックスペース決定」問題に適用されます!

def backtrack(i, n, *args)
  	if condition:
		add_answer()
	else:
		change()
 		backtrack(i+1, n, *args);
		remove_change()

次に、特定のトピックを通じてバックトラッキングアルゴリズムのスペースの
問題をさらに体験します
。nクイーン問題は、 nクイーンをn×nチェス盤に配置し、クイーンが互いに攻撃するのを防ぐ方法を研究することです。
整数nを指定すると、すべての異なるn女王解を返します。
各ソリューションには、明確なnクイーン問題のピース配置スキームが含まれています。ここで、「Q」と「。」はそれぞれクイーンと空室を表します。
これがバックトラックコアコードです。

 def backtrack(row):
            for col in range(len(cb)):
                if judge(row, col):
                	#开始试探
                    place_queen(row, col)
                    if row == len(cb) - 1:
                        add_cb()
                    else:
                        backtrack(row + 1)
                    #回到原点
                    remove_queen(row, col)

問題2
文字列sが与えられた場合、sを部分文字列に分割して、各部分文字列が回文列になるようにします。
可能なすべての分割スキーマを返します。

def backtrack(start):
    for end in range(start, len(s)):
         if judge(s[start:end + 1]):
               	temp.append(s[start:end+1])
         		if end + 1 == len(s):
               		save = copy.deepcopy(temp)
               		ans.append(save)
         		else:
               		backtrack(end + 1)
         		temp.pop()                   

トピック3
累積された数値は文字列であり、それを構成する数値は累積されたシーケンスを形成できます。

有効な累積シーケンスには、少なくとも3つの数値が含まれている必要があります。最初の2つの数値を除いて、文字列内の他の数値は、前の2つの数値の合計と等しくなります。

数字「0」〜「9」のみを含む文字列を指定して、指定された入力が累積数であるかどうかを判断するアルゴリズムを記述します。

説明:累積シーケンスの数値は0から始まっていないため、1、2、03または1、02、3の場合はありません。

#初始三个数通过for循环获取,这里只摘取回溯部分
def backtrack(num1, num2, num3, tot):
         if judge(num1, num2, num3):
                    if tot + 1 == len(num):
                        self.ans = True      
                    else:
                        for tot1 in range(tot + 1, len(num)):
                            if num[tot + 1] == '0' and tot + 1 != tot1:
                                continue
                            backtrack(num2, num3, int(num[tot + 1: tot1 + 1]), tot1)
                            

元の16件の記事を公開 いいね1 訪問数377

おすすめ

転載: blog.csdn.net/qq_41174940/article/details/103951204