C# アルゴリズムが張さんの誕生日問題を解決する

C# アルゴリズムが張さんの誕生日問題を解決する

C# アルゴリズムは張さんの誕生日問題をどのように実装するのでしょうか?まず、張さんの誕生日に関する質問を見直してみましょう。

シャオミンとシャオチアンは二人とも張先生の生徒です。張先生の誕生日はM月N日です。二人とも張先生の誕生日が次の10日のうちの1日であることを知っています。張先生はシャオミンにMの値を、シャオチアンにNの値を教えました。張先生は二人に、自分の誕生日が何日か知っているか尋ねました。

3月4日 3月5日 3月8日

6月4日から6月7日まで

9月1日から9月5日まで

12月1日 12月2日 12月8日

シャオミンは言った: 私が知らないなら、シャオチアンも知らないはずです。

シャオチアンは言った:最初は知らなかったけど、今は分かっている

シャオミンは言った: ああ、それなら私も知っています。

上記の会話に基づいて、張先生の誕生日は何日か推測してください。 ?

この論理推論問題は皆さんも見たことがあると思います。正解は9月1日です。ここでは推論のプロセスについては触れません。Googleで検索すればたくさんの答えが見つかります。私が言いたいのは、この推論結果を得るためにC#をどのように使用するかということです^_^

張さんの誕生日問題を解く C# アルゴリズムの推論プロセスは次のとおりです。

1. すべての誕生日セットを分析します。月は {3,6,9,12}、日は {4,5,8,7,1,5,2} です。

2. シャオミンは言った。「私が知らないなら、シャオチアンもきっと知らないよ。」その日のセットでは、{2,7}は1回だけ登場します。 Xiao Mingはこう言うだろうから、Xiao Mingが得たMは{6,12}ではないと推測できる。なぜなら、XiaoqiangのN値が{2,7}であれば、張先生の誕生日を直接取得でき、XiaomingのM値は無意味になるからです。そして、シャオミンがこれを言った場合、それはシャオミンの手札のMが{6,12}ではないことを意味します。

3. シャオチアンは言いました。「最初は知らなかったけど、今は分かりました。」 M={6,12} を差し引いた後、残りの可能性は {{3,4},{3,5},{3,8},{9,1},{9,5}} です。Xiaoqiang はそれを知っていると言いました。Xiaoqiang は N しか知らず、張先生の誕生日も確信していたため、残りのセットでは彼の N 値が一意である必要があります。これにより、{{3,5},{9,5}} が除外されます。

4. シャオミンは言いました。「ああ、それなら私も知っています。」シャオミンのMは月で、残りのセットは{{3,4},{3,8},{9,1}}です。シャオミンのMが3の場合、選択できる日付は2つあり、誕生日を決定できません。シャオミンは張先生の誕生日を判断できるので、シャオミンの手にあるMは9です。

張先生の誕生日は9月1日です。

以下のコードもこの考え方に従って書かれています。

張さんの誕生日問題を解く C# アルゴリズムのデモ コード

  1. クラスプログラム
  2. {
  3.      // / <要約>
  4.      /// 小明と小強は二人とも張先生の生徒です。張先生の誕生日はN月M日です。  
  5.      /// 二人とも、張さんの誕生日が次の10グループのうちの1つであることを知っています。  
  6.      /// 張先生は、小明にMの値を伝え、小強にNの値を伝えました。  
  7.      /// 張先生は生徒たちに、自分の誕生日がいつか知っているか尋ねました。  
  8.      /// 3月4日 3月5日 3月8日 
  9.      /// 6月4日 6月7日 
  10.      /// 9月1日 9月5日 
  11.      /// 12月1日 12月2日 12月8日 
  12.      /// シャオミンは言った: 私が知らないなら、シャオチアンもきっと知らない 
  13.      /// Xiaoqiangは言った: 以前は知らなかったが、今は知っている 
  14.      /// シャオミンは言った: ああ、それなら私も知っています。  
  15.      /// 上記の会話に基づいて、張先生の誕生日は何日か推測してください。 ?  
  16.      ///  
  17.      /// </要約>  
  18.      /// <param name="args"></param>  
  19.     静的  void Main(文字列[]引数)
  20. {
  21. Dictionary< int , int []> birthdays = new Dictionary< int , int []>();
  22. 誕生日.Add(1,新しい 整数[]{3,4});
  23. 誕生日.Add(2,新しい 整数[]{3,5});
  24. 誕生日.Add(3,新しい 整数[]{3,8});
  25. 誕生日.Add(4,新しい 整数[]{6,4});
  26. 誕生日.追加(5,新しい 整数[]{6,7});
  27. 誕生日.Add(6,新しい 整数[]{9,1});
  28. 誕生日.Add(7,新しい 整数[]{9,5});
  29. 誕生日.Add(8,新しい 整数[]{12,1});
  30. 誕生日.Add(9,新しい 整数[]{12,2});
  31. 誕生日.Add(10,新しい 整数[]{12,8});
  32.     
  33. 誕生日を分析します(誕生日);
  34.     
  35.          if (誕生日.キー.カウント > 0)
  36. {
  37.              foreach (KeyValuePair< int , int []> 誕生日内の項目)
  38. {
  39. Console.WriteLine( "張さんの誕生日は{0}月{1}日と考えられます" , item.Value[0], item.Value[1]);
  40. }
  41. }
  42.         それ以外    
  43. {
  44. Console.WriteLine( "解決策はありません" );
  45. }
  46. コンソールの行を読み取ります。
  47. }
  48.     
  49.     プライベート 静的  void AnalyseBirthday(Dictionary< int , int []> 誕生日)
  50. {
  51.          //days: N 個の値のコレクション、TKey: は N 個の値、TValue: は発生回数 
  52. Dictionary< int , int > days =新しいDictionary< int , int >();
  53.          //months: N 個の値すべてのコレクション、TKey: M 値、TValue: 発生回数 
  54. Dictionary< int , int > months = new Dictionary< int , int >();
  55.     
  56.          //誕生日を走査し、それぞれ日と月に値を割り当てます 
  57.          foreach (KeyValuePair< int , int []> 誕生日内の項目)
  58. {
  59.              days.ContainsKey(item.Value[1])の場合
  60. 日数[item.Value[1]] += 1;
  61.             それ以外    
  62. days.Add(item.Value[1], 1);
  63.              (months.ContainsKey(item.Value[0]))の場合
  64. 月[item.Value[0]] += 1;
  65.             それ以外    
  66. months.Add(item.Value[0], 1);
  67. }
  68.     
  69.          //N 個の値を格納するための一時リスト tempDays を宣言します 
  70. リスト< int > tempDays =新しいリスト< int >();
  71.          //M 値を格納するための一時リスト tempMonths を宣言します 
  72. リスト< int > tempMonths =新しいリスト< int >();
  73.          //誕生日のTKey値を格納するための一時的なList:keysを宣言する 
  74. リスト< int > keys =新しいリスト< int >();
  75.     
  76.          //値 N が 1 回だけ出現する可能性のあるすべての誕生日を検索し、tempDays に保存します。  
  77.          // 一意の N 値に対応する M 値を取得し、tempMonths に保存します。  
  78.          foreach (KeyValuePair< int , int > 項目の日数)
  79. {
  80.              (item.Value == 1)の場合
  81. {
  82. tempDays.Add(アイテム.Key);
  83.     
  84.                  foreach (KeyValuePair< int , int []>誕生日内の誕生日)
  85. {
  86.                      if (誕生日.値[1] == 項目.キー)
  87. {
  88.                          if (!tempMonths.Contains(birthday.Value[0]))
  89. tempMonths.Add(誕生日.Value[0]);
  90. }
  91. }
  92. }
  93. }
  94.     
  95.          // すべての誕生日を反復処理し、tempMonths にあるすべての誕生日を取得します 
  96.          //値はキー内の誕生日の対応するTKeyに格納されます 
  97.          foreach ( intin tempMonths)
  98. {
  99.              foreach (KeyValuePair< int , int []>誕生日内の誕生日)
  100.                  if (誕生日.値[0] == 月)
  101. キーを追加します(誕生日のキー)。
  102. }
  103.     
  104.          // キーをトラバースし、M=誕生日のキーであるあり得ない誕生日を削除します 
  105.          //月内の対応する値を削除します 
  106.          // 日の出現回数が1つ減ります 
  107.          foreach ( intキーinキー)
  108. {
  109. months.Remove(誕生日[キー][0]);
  110. 日数[誕生日[キー][1]] -= 1;
  111. birthdays.Remove(キー);
  112. }
  113.     
  114.          //日付か​​ら不可能な誕生日を削除する 
  115.          foreach ( int日数in tempDays )
  116. {
  117. days.Remove(day);
  118. }
  119.     
  120.          // tempDays をクリア 
  121. tempDays.Clear();
  122.          // キーをクリアする 
  123. キーをクリアします。
  124.     
  125.          // 可能性のあるすべての誕生日を走査し、値 N が 2 回出現する日付を削除します 
  126.          foreach (KeyValuePair< int , int > 項目の日数)
  127. {
  128.              if (item.Value > 1)
  129. {
  130. tempDays.Add(アイテム.Key);
  131.                  foreach (KeyValuePair< int , int []>誕生日内の誕生日)
  132. {
  133.                      if (誕生日.値[1] == 項目.キー)
  134. {
  135.                          if (!keys.Contains(birthday.Key))
  136. キーを追加します(誕生日のキー)。
  137. 月[誕生日.値[0]] -= 1;
  138. }
  139. }
  140. }
  141. }
  142.          foreach ( intキーinキー)
  143. birthdays.Remove(キー);
  144.     
  145. キーをクリアします。
  146. tempMonths.Clear();
  147.     
  148.          //すべての誕生日を走査し、値Mが2回出現する日付を削除します 
  149.          foreach (KeyValuePair< int , int >月単位項目)
  150. {
  151.              if (item.Value > 1)
  152.                  if (!tempMonths.Contains(item.Key))
  153. tempMonths.Add(item.Key);
  154. }
  155.          foreach ( intin tempMonths)
  156. {
  157.              foreach (KeyValuePair< int , int []> 誕生日内の項目)
  158.                  if (item.Value[0] == 月)
  159.                      if (!keys.Contains(item.Key))
  160. キーを追加します。(item.Key);
  161. }
  162.          foreach ( intキーinキー)
  163. birthdays.Remove(キー);
  164.                 
  165. }
  166. }

プロセス全体で foreach が多すぎるため、効率性に大きな問題があり、レベルが制限されています。ネットユーザーの皆様にもアドバイスを頂ければ幸いです!ありがとう、へへ :-)

これで、張さんの誕生日問題を解くための C# アルゴリズムの紹介は終わりです。C# アルゴリズムの学習に役立つことを願っています。

<<:  C#アルゴリズムで解決した面接の質問

>>:  C# アルゴリズムの選択ソートの簡単な分析

ブログ    

推薦する

データセンターは効率性を向上させるためにさらなる機械学習を必要としている

世界経済フォーラムによると、2025年までに世界では毎日463EBのデータが生成されることになります...

多くのライターがChatGPTを著作権侵害で非難した。OpenAI: 著作権の範囲を誤解している

8月31日、OpenAIは今週、原告に数人の作家を含むほぼ同一の集団訴訟2件に応じた。彼らは、Cha...

...

...

データサイエンスのための Python: ニューラル ネットワーク

人工ニューラル ネットワーク (ANN) は、数学的および物理的な方法を使用して人間の脳のニューラル...

2019年世界人工知能製品応用博覧会は今年5月に蘇州で開催される。

2019年グローバルスマート博覧会は今年5月9日から11日まで蘇州工業園区で開催される予定だ。蘇州...

機械学習の課題:ブラックボックスモデルはこれら3つの問題に直面している

[[441689]] 01 機械学習の課題2016年3月、ディープラーニングアルゴリズムに基づくAl...

1 つの記事でクラスタリング アルゴリズムを理解する

1. クラスタリングの基本概念1.1 定義クラスタリングはデータマイニングにおける概念であり、特定の...

...

調査によると、人工知能ソフトウェア市場は2025年までに370億ドルに達すると予想されている。

Forrester は、2025 年までの市場規模をより現実的に把握するために、AI ソフトウェア...

知っておくべき 8 つのニューラル ネットワーク アーキテクチャ

ニューラル ネットワークは機械学習におけるモデルの一種です。ニューラル ネットワークは、機械学習の分...

不意を突かれたGoogleの「人間の創造」の成功は恐ろしい!人類は歴史上最悪の失業の波に直面しています...

01不意を突かれた!今回、Google は「人間を作った」のです! 5月8日、Googleは毎年恒...

...

AI アシスタントの人気が高まっていますが、次に購入するスマートフォンはなぜ電話なのでしょうか?

大きな模型ブームが到来し、アイアンマンのジャービスが最も忙しい「マーベルヒーロー」(手動の犬の頭)に...

自動運転にはバブルが必要

業界に「金儲けの見込み」があれば、必然的に「混乱」が起こります。 10年前はスマートフォンでしたが、...