アルゴリズムマラソン6日目
7703 ワード
35日です。
NとM(2)
まず、この問題をよりよく理解するためには、まず次の問題を解決したほうがいい.
NとM(1)
n, m = list(map(int, input().split()))
s = [] # m개의 수열을 저장하기 위한 리스트
def dfs():
if len(s) == m: # 수열이 m개가 되면 모든 숫자를 출력하고 리턴
print(' '.join(map(str, s)))
return
for i in range(1, n + 1): # 1부터 n까지의 숫자들을 모두 확인
if i not in s: # 중복이 아닐 경우에만 숫자 넣기
s.append(i)
dfs()
s.pop()
dfs()
ここでn=4,m=2であれば、i=1からs=[1]
→再帰→s=[1,2]
→出力→pop→s=[1]
→再帰→出力→pop→s=[1,3]
→s=[1]
→再帰→出力→pop→i=2のときである.このように行います.NおよびM(2)の問題において、
s=[1,4]
、[1,2]
が繰り返される場合、[2,1]
のみが出力されるべきである.再帰呼び出し時に、自分の次の数字を呼び出すことで、前の数字が後の数字より小さい場合を排除します.
n, m = list(map(int, input().split()))
s = []
def dfs(start):
if len(s) == m:
print(' '.join(map(str, s)))
return
for i in range(start, n + 1):
if i not in s:
s.append(i)
dfs(i + 1) # 재귀 호출 시에는 자기 다음 숫자를 불러오게 된다.
s.pop()
dfs(1)
36番
N-Queen
N × Nチェス盤にN個の皇后があり、皇后同士が攻撃できない場合は、数字を出力すればよい.
相手が攻撃できないようにするには、女王の直線や対角線に他の皇后が置かれているかどうかをチェックします.
遡及に関する問題がずっと出ているので、遡及に関する概念を整理してみましょう.
バックトラッキングとはDFS+枝切りです.DFSは再帰的に問題を解決することを意味し、ブランチはbreakやcontinueなどを中間的に使用して不要な再帰呼び出しを阻止することを意味する.
難しすぎます...
37日
階段を登る
38番
タレット
39日
ブラックジャッキ
40日
ぶんかい和
6日
自動番号付け
11日です。
Fly me to the Alpha Centauri
Reference
この問題について(アルゴリズムマラソン6日目), 我々は、より多くの情報をここで見つけました https://velog.io/@seanstainability/알고리즘-마라톤-6일차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol