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# アルゴリズムの選択ソートの簡単な分析

ブログ    

推薦する

テクノロジーの専門家が若者と対談、第1回JD全国大学生アルゴリズム設計・プログラミングエリート競技会セミナーが開催されました

最近、「2021 JD全国大学生アルゴリズム設計・プログラミングエリートコンテスト-コードの無限の想...

音声アシスタント業界はどこへ向かうのでしょうか?

プログレス・パートナーズの創設者兼シニアマネージングディレクターのニック・マクシェーン氏は、「今後数...

MITチームがCOVID-19の早期警告に役立つ可能性のある咳分析AIを開発

無症状感染者の存在により、COVID-19の検出と制御は非常に困難になります。 しかし、MITの研究...

...

テキスト処理から自動運転まで: 機械学習で最もよく使われる 50 の無料データセット

機械学習分野のオープンデータセットにはどのようなものがあるでしょうか。Gengo は最近、高品質の無...

複雑な課題に対するスマートなソリューション: 自動化の成功への道

マッキンゼーの「2022年世界産業用ロボット調査」によると、産業企業は世界的な労働力不足に対処するた...

Pythonアルゴリズムを使用して取引する方法

投資管理会社でシステム開発エンジニアとして働いていたとき、定量金融で成功するには、数学、プログラミン...

...

...

...

AGI を理解する: 知能の未来?

病気の診断から交響曲の作曲、車の運転から道徳的な判断に至るまで、人間が行えるあらゆる作業を機械が実行...

GoogleはGoogleアシスタントを生成AIでアップデートする予定

8月1日、海外メディアは、Axiosの報道によると、GoogleはGoogleアシスタントを生成AI...

機密コンピューティングが生成型AIの導入を確実にする方法

生成 AI は、新しい製品、ビジネス、業界、さらには新しい経済に情報を提供することができます。しかし...

2018年栄智連ITイネーブラーサミットのゲストラインナップが発表されました

現在、中国ではデジタル革命が急速に進んでおり、デジタル変革は国内企業が課題に対処するための主な戦略と...

人工知能の新たな用途:死者の蘇生

映画では必ず蘇生のシーンが出てきますが、現実の世界でも人間を冷凍保存するプロジェクトがあります。その...