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

推薦する

CCTV:AI修復により、生産ラインから出荷された国産車の最初のバッチを再現

IT Homeは7月4日、解放CA10トラックが1956年7月に生産ラインから出荷されたと報じた。こ...

ロボットと自動化技術は、パンデミックの新たな常態の中でどのように新しい雇用を生み出すのでしょうか?

AI テクノロジーと自動化ソリューションは、仕事を奪う諸悪の根源なのでしょうか、それとも新しいプラ...

不確実な環境で自動運転を実現するにはどうすればよいでしょうか?

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

アリババ・ダモ・アカデミーがAI防疫技術を再現:CT画像を20秒で解釈、認識精度は96%

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

ヘルスケアにおける6つの新たなテクノロジートレンド

ヘルスケア業界におけるテクノロジーの浸透は、この分野の専門家のほぼすべての業務に影響を及ぼしています...

機械学習と人工知能がサイバーセキュリティを向上させる方法

[[375875]]今日、サイバー攻撃はますます蔓延しており、組織が導入しているセキュリティ ツール...

最高人民検察院は、虚偽訴訟の監視に人工知能とビッグデータを活用することを検討している。

虚偽の訴訟は、他人の正当な権利と利益を侵害するだけでなく、社会の健全性を著しく損ない、司法の公平性、...

一般的なソートアルゴリズムの概要

概要コンピュータサイエンスと数学において、ソートアルゴリズムとは、一連のデータを特定の順序で並べるア...

顔認識はセキュリティの発展の障害になるのでしょうか?

現在、顔認識は人々の生活のあらゆる側面に組み込まれています。携帯電話のロック解除、顔をスワイプしての...

AIを活用した未来における教育の再考

大学を卒業するデータ サイエンティストの数が依然として不足していますが、今後の AI 革命には、AI...

海外メディア:マスク氏はxAIがOpenAIに勝つと夢想しているが、わずか11人の研究者に頼るのは難しすぎる

7月13日、イーロン・マスク氏が新たに設立した人工知能企業xAIは、「宇宙を理解する」ことができ、O...

人工知能オープンプラットフォームの構築が活況を呈しており、AIの将来の発展は有望である

人工知能は、応用と開発のチャンスの時代をもたらしました。人工知能は、新たな産業変革の原動力であるだけ...

DES、3DES、AES、PBE対称暗号化アルゴリズムの実装と応用

[[272601]] 1. 対称暗号化アルゴリズムの概要対称暗号化アルゴリズムは、成熟した技術を備...

AIは水産養殖業界に浸透しつつある。品質と効率性の向上に加え、人員の削減にもつながる。

[[264097]]この農場では、人工知能技術の活用により、人員が 3 分の 2 削減されました。...