2013-03-29 5 views
16

奇妙な質問は次のとおりです。
私の学校では競技の解決に問題があり、私たちはコンピュータを使用することができます。私はコード作成方法を知っている唯一の競争相手だから、問題をより早く解決するためにCとPascalプログラムを使用します。私は擬似コードからコードへの演習、アルゴリズム、Collat​​zの憶測の検証などでこれを行ってきました。
昨日、私は次のチャレンジ(4月18日)のために練習していました。私はヤング・テーブルローの運動を見ました。
"Ferrersダイアグラムは、1つ以上の横の行に分散されたN個のボックスの構成で、左揃えで構成され、すべての行に等しいかそれ以下のものが含まれるように構成されています(イタリア語からの翻訳には最善を尽くします)
ferrers diagrams http://olimpiadiproblemsolving.it/immagini_test/mate/finale_2011_m_07a_400.jpg
ヤングtableauは、1からの整数で満たされたN個の箱のFerrers図です。この図のように、箱の数のリストで記述することができます。 N.例:
young tableaux http://olimpiadiproblemsolving.it/immagini_test/mate/finale_2011_s_03b_400.jpg
ボックス内の数字が行と列で昇順にソートされる場合、テーブルは「標準」です(例:第1、第3、第5テーブル)。標準tableauxの場合、最初の行の最初のボックスには常に1が含まれます.Nは常にダイアグラムの行の1つ左のボックスにあります。図6は、1行目の6箱に固定されており、11が中に固定されている場合)
1:


PROBLEMヤングテーブルウのプログラミング

[6,3,2,1,1,1] Ferrersの図を検討最初の列の最後のボックスで、標準的な方法でいくつの方法で図を完成させることができますか?

2)最初の列の6番目のボックスに7が固定され、1番目の列の最後のボックスに11が固定されている場合、標準的な方法でいくつの方法で図を完成できますか?

3)最初の列の6番目のボックスに8が固定され、1番目の列の最後のボックスに11が固定されている場合、標準的な方法でいくつの方法で図を完成できますか?

I '私はこれらの数字と "行末の文字"として "-1"でいっぱいの行列を持つソリューションをコード化しようとしましたが、私は立ち往生しました。 ?」。プログラムを使用せずに

+1

このため、PrologはCよりも優れたツールになると思います。 – ppeterka

+0

私はこのようなうわべの質問をここで見てきました。ここで、私の最後のupvoteを今日取る。 –

+0

Ehm ... Prologとは何ですか? – user2179983

答えて

1

、私は1への答えを信じて)手でこれを導出2.あるアルゴリズムの解に誰かを導くかもしれない。

最初の行は1から始まり、そこで6で終了可能な数x < 6.このテーブルに入ることができる14桁のうち、その条件を満たすのは4桁だけです:2 3 4 5.これは、行1が次のものでなければならないことを意味します。1 2 3 4 5 6.

最初の列は1で始まり、11で終わります。最初の列に入る数値は、同様の条件を満たす必要があります。1 < y < 11.残りの未割り当て数のうち、わずか4 7 8 9 10 10.最初の列が次のようになります。1 7 8 9 10 11.

現在残っている数字は3つだけです:12 13 14.残りの3つの細胞は、この表色系のものである。

- または -

コードでこれに取り組むしようとすると、1が行くことができる:彼らを配置することができますブルートフォースルート、または制約の伝搬とバックトラッキング技術を調べることができます。これが誰かがPrologを早期に提案した理由です。見るべきもう一つの言葉はPythonだろう。

+0

私はちょうどまた、これを質問に追加するためにページをリフレッシュしていたことに気づいた。 1行目は1 2 3 4 5 6でなければなりません。第1列は1ですか? ? 9 10 11、4行目と5行目は1つのボックスで構成されているためです。これは、2)と3)についても当てはまります。これは、第1行に可能な数字を追加するだけです。あなたが書いた解決策には問題があります:2)と3)では、2)で7が割り当てられ、3)で8が割り当てられているため、1列目に1 7 8 9 10 11と書くことはできません。 2)と6)と8)を逆にすると(1列目が1 6 7 9 10 11となるように6と7も反転する)、2)と3)の答えは2です。 – user2179983

+0

これは、第1列の最後のボックスに11が固定され、第1行の最後のボックスに任意の数<11が固定されている[6,3,2,1,1,1]テーブルでは、 2標準ソリューション? – user2179983

+0

私は既にあなたの初期の制約を満たすtableaux用の6つのソリューションを見つけました。私が試しているテーブルは、8は最初の行の最後のセルに、11は最初の列の最後のセルにあります。非常に可能性の高いソリューションは6つ以上ありますが、ここでは休憩の終わりに達しています。 :) –

0

これは制約論理プログラミングの問題です。プログラミング言語のPrologを使用してください。 clpfdライブラリを持つSicstusプロローグ。などのレイアウトを考慮

:ここ

ABCDEF 
GHI 
JK 
L 
M 
N 

--Code--

use_module(library(clpfd)). 

all_different([A,B,C,D,E,F,G,H,I,J,K,L,M,N]), 
domain([A,B,C,D,E,F,G,H,I,J,K,L,M,N],1,14), 
B #> A, C#> B, D #> C, E #> D, F #> E, 
G #> A, H #> B, H #> G, I #> G, I #> H, I #> C, 
J #> A, J #> G, 
L #> A, L #> G, L #> J, 
M #> A, M #> G, M #> J, M #> L, 
N #> A, N #> G, N #> J, N #> L, N #> M. 

A=1 
F=6 
N=11 
+0

私はこれをファイルにコピーしてSWIPrologと相談しましたが、予期しないファイルの終わりのエラーが出ます。私は何をすべきか?私はグーグルを試みたが、何もしなかった。 : – user2179983

4

は、最初の問題のためにSWI-プロローグを用いて試料溶液である:

:- use_module(library(clpfd)). 

tableau(Ts) :- 
     Ts = [[A,B,C,_,_,F], 
       [G,H,I], 
       [J,K], 
       [L], 
       [M], 
       [N]], 
     A = 1, 
     maplist(ascending, Ts), 
     ascending([A,G,J,L,M,N]), 
     ascending([B,H,K]), 
     C#< I, 
     append(Ts, Vs), 
     all_different(Vs), 
     Vs ins 1..14, 
     F = 6, 
     N = 11, 
     label(Vs). 

ascending(Vs) :- chain(Vs, #<). 

答えは、テーブルを完成させる2つの方法があるということです:

?- tableau(Ts), maplist(writeln, Ts). 
[1,2,3,4,5,6] 
[7,12,13] 
[8,14] 
[9] 
[10] 
[11] 
    Ts = [[1, 2, 3, 4, 5, 6], [7, 12, 13], [8, 14], [9], [10], [11]] ; 
[1,2,3,4,5,6] 
[7,12,14] 
[8,13] 
[9] 
[10] 
[11] 
    Ts = [[1, 2, 3, 4, 5, 6], [7, 12, 14], [8, 13], [9], [10], [11]] ; 
false. 
+0

ありがとうございました!この1つはSWIPrologと相談して、私は若いtableauxの問題についてそれを操作する方法を学びました!ありがとうございました! – user2179983

3

これを解決するには、Constraint Programming(CP)を使用します。新しいCPシステムを学ぶときに私が解決しようとする標準的な問題の1つです。ここまでの実装のリストはhttp://hakank.org/common_cp_models/#youngtableauxです。

私は、あなたの特定の質問にいくつかの特別な制約を加えて「プレーン」MiniZincモデルを変更しました。ここにフルモデルを参照してください: http://www.hakank.org/minizinc/young_tableaux_stack_overflow.mzn

(MiniZincは非常に高いレベルと、このような問題のためで実験するのは簡単です。)モデルでの表現についてのショート

:サイズnの問題(パーティション用 ボックスは、1からn + 1までの値を持つグリッド( "x"、n倍のn倍)で表され、各行と列は昇順にソートされます。したがって、n + 1は最後にソートされ、空の値として動作します。パーティション構造( "p")はYoung/Ferrer構造に準拠するように処理されます(詳細はモデルを参照)。追加制約がある

  • は、特定の数は、最初の行 の6ボックス内にすべきである:

    3つの質問のそれぞれは、(問題の標準製剤と比較して)2つの追加の制約を有していますX 6%又は7又は8

  • 及び11は、第1の列 の最後のボックスであるべき= [1,6]これは少し複雑ですが、私の方法は、本である、すなわち 最初の列にその11はn + 1より小さい値の最後でなければならず、すなわち、 列に以下のすべての値は、n + 1です:私が正しく質問を理解している場合

    exists(j in 1..n) (
         x[j,1] = 11 /\ forall(k in j+1..n) (x[k,1] = n+1) 
    ) 
    

だから、答えは次のとおりです。 1)2つのソリューション 2)10のソリューション 3)30社のソリューションは、

+0

非常に興味深いリンクです!そこに記載されているCPシステム – user2179983

+0

制約の伝播は、多くのクラスの困惑や問題について知っておくと良いでしょう。私が新しい言語を学ぶとき、私は典型的にPeter Norvigの[Sudoku Pythonのソルバー](http://www.norvig.com/sudoku.html)を参照してください。 –

関連する問題