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

推薦する

リアルタイム、高精細、高忠実度:より強力なビデオ再構成アルゴリズム、大幅に向上したパフォーマンス

画像編集の分野がここ数年で飛躍的に成長したことは周知の事実です。しかし、ビデオ分野ではまだいくつかの...

人工知能は医師に完全に取って代わることはできない

今後数年間で、初めて医療用人工知能 (AI) システムとやり取りすることになるかもしれません。自動運...

エヌビディアによる660億ドルのアーム買収は失敗、ソフトバンクはIPOを通じてアームの事業を独立上場へ

ソフトバンクによる英国の半導体事業アームのエヌビディアへの660億ドルでの売却計画は、米国、英国、欧...

中小企業はデータセンターの自動化によってもたらされる課題にどのように対処するのでしょうか?

デジタル変革の時代において、データセンターは現代の企業のバックボーンを支える上で重要な役割を果たしま...

人工知能が消去された画像を完璧な結果で再現します!

革命的な新しい人工知能プログラムは、画像の欠けている部分をすべて完璧に再現できることをすぐに納得させ...

マインドコントロールが現実に:話したり手を動かさずに、ただ横たわっているだけでゲームをプレイできる

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

MIT、「上級数学」ソルバーの強化版をリリース:7つのコースの正解率は81%

AIは小学校の算数の文章題を解くだけでなく、高度な数学にも取り組み始めています。最近、MIT の研...

エンタープライズグレードのインテリジェントオートメーションガイド

エンタープライズ グレードのインテリジェント オートメーションとは何ですか?エンタープライズ レベル...

百新銀行と百度クラウドAI+銀行金融技術シンクタンク会議が開催、オープンバンキングについて議論

11月19日、北京で「百度銀行&百度クラウドAI+銀行金融技術シンクタンク」が開催されました。カンフ...

個人情報保護を強力に強化

動物園に行くときは指紋で「チェックイン」する必要があり、家に帰ってコミュニティに入るときも顔をスキャ...

NYU の具現化知能における新たな進歩: 視覚的なフィードバックで缶を開ける方法を学習し、タスクの成功率が 135% 向上、LeCun 氏はそれを好意的に評価

ロボットがペンチで簡単にワイヤーを切る様子をご覧ください。あっという間に鉄の箱の蓋が開きました。さら...

大規模言語モデルの 7 つの一般的なネットワーク セキュリティ アプリケーション

サイバー脅威の攻撃と防御のバランスがますます不均衡になっている時代に、人工知能と大規模言語モデル (...

ニューラルネットワークはマルウェアを隠すことができる、と研究で判明

[[441136]] [51CTO.com クイック翻訳]ディープラーニング モデルには数百万、ある...

...

人工知能を無料で学べるトップ 10 ウェブサイト

多くの人が人工知能に非常に興味を持っていますが、どこから始めればよいか分かりません。次に紹介する 1...