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

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

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

1回答

2231閲覧

8クイーン問題について

lime_penguins

総合スコア3

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

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

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

0クリップ

投稿2020/11/10 05:42

8クイーン問題を学習しているのですが、わからない箇所があります。
なぜ、reversed(col)でリストを逆順に並べているのでしょうか?
全体的に流れがつかめていないので、困っています。
よろしくお願いいたします。

Python

1N = 8 2 3# 斜めのチェック 4def check(x, col): 5 for i, row in enumerate(reversed(col)): #ここがわかりません 6 if (x + i + 1 == row) or (x - i - 1 == row): 7 return False #配置不可 8 return True 9 10def search(col): 11 if len(col) == N: 12 print(col) 13 return 14 15 for i in range(N): 16 if i not in col: 17 if check(i, col): 18 col.append(i) 19 search(col) 20 col.pop() 21 22search([])

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

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

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

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

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

guest

回答1

0

colの反転を横軸/rowを縦軸にし、それぞれの和を並べると:

| 4 3 2 1 0 --+--------------- 0 | 4 3 2 1 0 1 | 5 4 3 2 1 2 | 6 5 4 3 2 3 | 7 6 5 4 3 4 | 8 7 6 5 4

同じ数が 右下がりナナメ に並びます

colの反転を横軸/rowを縦軸にし、それぞれの差を並べると:

| 4 3 2 1 0 --+--------------- 0 | 4 3 2 1 0 1 | 3 2 1 0 -1 2 | 2 1 0 -1 -2 3 | 1 0 -1 -2 -3 4 | 0 -1 -2 -3 -4

同じ数が 右上がりナナメ に並びます

これを使って"斜めのチェック"をやってます。

[追記] コメントつけてみた

Python

1N = 8 2 3# 斜めのチェック 4def check(x, col): 5 for i, row in enumerate(reversed(col)): #ここがわかりません 6 if (x + i + 1 == row) or (x - i - 1 == row): 7 return False #配置不可 8 return True 9 10# 8-queenのルールを満足するcolを生成する 11def search(col): 12 if len(col) == N: # colの要素数がN個に達したら 13 print(col) # プリントして 14 return # 終了 15 16 for i in range(N): # i = 0, 1, ... N-1 に対し 17 if i not in col: # col中にiが含まれないときに限り 18 if check(i, col): # そのiをcolに追加しても8-queen のルールに反しないなら 19 col.append(i) # colの末尾に追加し 20 search(col) # 検索を続け 21 col.pop() # colの末尾から取り除く(次のiを試みる) 22 23search([])

投稿2020/11/10 08:21

編集2020/11/10 18:42
episteme

総合スコア16612

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

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

lime_penguins

2020/11/10 11:18

ご回答ありがとうございます! 私は再帰が苦手で全体的にうまく流れが掴めないのですが、 このプログラムの流れをざっくりと説明していただくことは可能でしょうか。 お手数ですが、よろしくお願いいたします。
episteme

2020/11/10 18:43

ざっくりとコメントをつけてみた(追記)
lime_penguins

2020/11/11 06:42

追記もしていただきありがとうございます! 何度も申し訳ありません。やはり斜めのチェックのところでつまずいてしまいます…。 ①for i, row in enumerate(reversed(col)): なぜここで「colの反転を横軸/rowを縦軸」と読み取ることができるのか ②if (x + i + 1 == row) or (x - i - 1 == row): ここで右下がり斜め、右上がり斜めにあるか確認しているというのはわかります。 しかし、なぜ (x + i + 1 == row)、(x - i - 1 == row)という式になるのでしょうか。 具体的な数字を入れていただけると大変助かります。 この2点をずっと考えているのですが、なかなか理解することができませんでした。 初心的な質問ですが、お答えいただけると嬉しいです。 よろしくお願いいたします。
episteme

2020/11/11 07:27

> この2点をずっと考えているのですが、なかなか理解することができませんでした。 あなたの理解 を 他人が代行する ことはできんでしょ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問