欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)的24點游戲?qū)嵗斀?/h1>
 更新時間:2015年08月14日 11:38:28   作者:北風(fēng)其涼  
這篇文章主要介紹了C#實現(xiàn)的24點游戲,較為詳細的分析了24點游戲的算法原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例分析了C#實現(xiàn)的24點游戲。分享給大家供大家參考。具體如下:

1. 24點游戲規(guī)則及算法

規(guī)則:給出4個自然數(shù),找出能夠求出24的四則運算式,要求數(shù)字不能重復(fù)使用
分析:

本算法是一種暴力求解法:

給出任意兩個數(shù)字,可以進行6種四則運算,求出最多6個值。以數(shù)字a和b為例,有:

加(a+b)、減(a-b)、被減(b-a)、乘以(a*b)、除以(a/b)和除(b/a)
abcd共計四個數(shù),如果順序固定,則有5種計算順序(★代表上面6種四則運算中的一種):

((a★b)★c)★d、(a★b)★(c★d)、(a★(b★c))★d、a★((b★c)★d)、a★(b★(c★d))

給出的四個數(shù)字,n1n2n3n4,有4*3*2=24種全排列的方法

2. 相關(guān)函數(shù)

/// <summary>
/// 判斷abcd四個數(shù)進行任意四則運算后能不能得出24,每個數(shù)字只能用一次
/// </summary>
/// <param name="a">數(shù)字a</param>
/// <param name="b">數(shù)字b</param>
/// <param name="c">數(shù)字c</param>
/// <param name="d">數(shù)字d</param>
/// <param name="expression"></param>
/// <returns></returns>
private static bool Try24(int a, int b, int c, int d, ref string expression)
{
 //a字頭
 if (TryEach(a, b, c, d, ref expression)) return true;
 if (TryEach(a, b, d, c, ref expression)) return true;
 if (TryEach(a, c, b, d, ref expression)) return true;
 if (TryEach(a, c, d, b, ref expression)) return true;
 if (TryEach(a, d, b, c, ref expression)) return true;
 if (TryEach(a, d, c, b, ref expression)) return true;
 //b字頭
 if (TryEach(b, a, c, d, ref expression)) return true;
 if (TryEach(b, a, d, c, ref expression)) return true;
 if (TryEach(b, c, a, d, ref expression)) return true;
 if (TryEach(b, c, d, a, ref expression)) return true;
 if (TryEach(b, d, a, c, ref expression)) return true;
 if (TryEach(b, d, c, a, ref expression)) return true;
 //c字頭
 if (TryEach(c, a, b, d, ref expression)) return true;
 if (TryEach(c, a, d, b, ref expression)) return true;
 if (TryEach(c, b, a, c, ref expression)) return true;
 if (TryEach(c, b, c, a, ref expression)) return true;
 if (TryEach(c, d, a, b, ref expression)) return true;
 if (TryEach(c, d, b, a, ref expression)) return true;
 //d字頭
 if (TryEach(d, a, b, c, ref expression)) return true;
 if (TryEach(d, a, c, b, ref expression)) return true;
 if (TryEach(d, b, a, c, ref expression)) return true;
 if (TryEach(d, b, c, a, ref expression)) return true;
 if (TryEach(d, c, a, b, ref expression)) return true;
 if (TryEach(d, c, b, a, ref expression)) return true;
 return false;
}
/// <summary>
/// 判斷指定順序的四個數(shù)abcd進行任意四則運算后能不能得出24,每個數(shù)字只能用一次
/// </summary>
/// <param name="a">數(shù)字1</param>
/// <param name="b">數(shù)字2</param>
/// <param name="c">數(shù)字3</param>
/// <param name="d">數(shù)字4</param>
/// <param name="expression"></param>
/// <returns></returns>
private static bool TryEach(int a, int b, int c, int d, ref string expression)
{
 expression = "";
 //兩個數(shù)可以做6種運算:加、減、被減、乘以、除以、除
 //四個數(shù)共可以進行6*6*6=216種不同次序的四則運算
 //初始化數(shù)組
 for (int i = 0; i < 6 * 6 * 6; i++)
 {
  //a與b間的運算符:i / 36
  //b與c間的運算符:i % 36 / 6
  //c與d間的運算符:i % 6
  //1.運算順序:a和b,再和c,再和d
  {
   string expression1 = "", expression2 = "";
   int temp1 = ResultOf(a, b, i / 36, ref expression1);
   int temp2 = ResultOf(temp1, c, i % 36 / 6, ref expression2, expression1);
   int result = ResultOf(temp2, d, i % 6, ref expression, expression2);
   if (result == 24) return true;
  }
  //2.運算順序:a和b,c和d,前面部分和后面部分
  {
   string expression1 = "", expression2 = "";
   int temp1 = ResultOf(a, b, i / 36, ref expression1);
   int temp2 = ResultOf(c, d, i % 6, ref expression2);
   int result = ResultOf(temp1, temp2, i % 36 / 6,
    ref expression, expression1, expression2);
   if (result == 24) return true;
  }
  //3.運算順序:b和c運算,再與a運算,再與d運算
  {
   string expression1 = "", expression2 = "";
   int temp1 = ResultOf(b, c, i % 36 / 6, ref expression1);
   int temp2 = ResultOf(a, temp1, i / 36, ref expression2, "", expression1);
   int result = ResultOf(temp2, d, i % 6, ref expression, expression2);
   if (result == 24) return true;
  }
  //4.運算順序:b和c運算,再與d運算,再與a運算
  {
   string expression1 = "", expression2 = "";
   int temp1 = ResultOf(b, c, i % 36 / 6, ref expression1);
   int temp2 = ResultOf(temp1, d, i % 6, ref expression2, expression1);
   int result = ResultOf(a, temp2, i / 36, ref expression, "", expression2);
   if (result == 24) return true;
  }
  //5.運算順序:c和d運算,再和b運算,再和a運算
  {
   string expression1 = "", expression2 = "";
   int temp1 = ResultOf(c, d, i % 6, ref expression1);
   int temp2 = ResultOf(b, temp1, i % 36 / 6, ref expression2, "", expression1);
   int result = ResultOf(a, temp2, i / 36, ref expression, "", expression2);
   if (result == 24) return true;
  }
 }
 expression = "Abandoned";
 return false;
}
/// <summary>
/// 求兩數(shù)進行某一四則運算后的結(jié)果
/// </summary>
/// <param name="x">數(shù)字1</param>
/// <param name="y">數(shù)字2</param>
/// <param name="method">(0-5分別代表:加、減、被減、乘以、除以、除)</param>
/// <param name="expression">返回的表達式</param>
/// <param name="expressionLeft">數(shù)字1表達式</param>
/// <param name="expressionRight">數(shù)字2表達式</param>
/// <returns></returns>
private static int ResultOf(int x, int y, int method,
 ref string expression, string expressionLeft = "", string expressionRight = "")
{
 //左右表達式之前被判定為無效則不計算,除數(shù)為0時不計算
 if (expressionLeft == "Abandoned" || expressionRight == "Abandoned" ||
  (x == 0 && method == 5) || (y == 0 && method == 4))
 {
  expression = "Abandoned";
  return -1;
 }
 int result = 0;
 switch (method)
 {
  case 0:
   {
    //加
    result = x + y;
    expression = string.Format("{0}+{1}",
     expressionLeft == "" ? x.ToString() : expressionLeft,
     expressionRight == "" ? y.ToString() : expressionRight);
   }
   break;
  case 1:
   {
    //減
    result = x - y;
    expression = string.Format("{0}-{1}",
     expressionLeft == "" ? x.ToString() : expressionLeft,
     expressionRight == "" ? y.ToString() : expressionRight);
   }
   break;
  case 2:
   {
    //被減
    result = y - x;
    expression = string.Format("{1}-{0}",
     expressionLeft == "" ? x.ToString() : expressionLeft,
     expressionRight == "" ? y.ToString() : expressionRight);
   }
   break;
  case 3:
   {
    //乘以
    result = x * y;
    expression = string.Format("({0})*({1})",
     expressionLeft == "" ? x.ToString() : expressionLeft,
     expressionRight == "" ? y.ToString() : expressionRight);
   }
   break;
  case 4:
   {
    //除以
    if (x % y == 0)
    {
     result = x / y;
     expression = string.Format("({0})/({1})",
      expressionLeft == "" ? x.ToString() : expressionLeft,
      expressionRight == "" ? y.ToString() : expressionRight);
    }
    else
    {
     expression = "Abandoned";
    }
   }
   break;
  case 5:
   {
    //除
    if (y % x == 0)
    {
     result = y / x;
     expression = string.Format("({1})/({0})",
      expressionLeft == "" ? x.ToString() : expressionLeft,
      expressionRight == "" ? y.ToString() : expressionRight);
    }
    else
    {
     expression = "Abandoned";
    }
   }
   break;
 }
 //運算不合法,則返回-1,表達式為Abandoned,
 if (expression == "Abandoned")
 {
  return -1;
 }
 return result;
}

3. Main函數(shù)調(diào)用

static void Main(string[] args)
{
 string s = "";
 bool try24;
 try24 = Try24(1, 2, 3, 4, ref s); Console.WriteLine("1,2,3,4: " + s);
 try24 = Try24(1, 3, 5, 7, ref s); Console.WriteLine("1,3,5,7: " + s);
 try24 = Try24(2, 3, 6, 4, ref s); Console.WriteLine("2,3,6,4: " + s);
 try24 = Try24(5, 7, 9, 4, ref s); Console.WriteLine("5,7,9,4: " + s);
 try24 = Try24(6, 3, 4, 5, ref s); Console.WriteLine("6,3,4,5: " + s);
 try24 = Try24(9, 5, 2, 7, ref s); Console.WriteLine("9,5,2,7: " + s);
 try24 = Try24(4, 9, 8, 3, ref s); Console.WriteLine("4,9,8,3: " + s);
 try24 = Try24(4, 9, 8, 2, ref s); Console.WriteLine("4,9,8,2: " + s);
 try24 = Try24(10, 10, 10, 10, ref s); Console.WriteLine("10,10,10,10: " + s);
 Console.ReadLine();
}

4. 程序運行結(jié)果:

希望本文所述對大家的C#程序設(shè)計有所幫助。

相關(guān)文章

  • C#中拋出異常用法實例

    C#中拋出異常用法實例

    這篇文章主要介紹了C#中拋出異常用法,實例分析了C#使用throw拋出異常的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Unity實現(xiàn)汽車前后輪倒車軌跡計算

    Unity實現(xiàn)汽車前后輪倒車軌跡計算

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)汽車前后輪倒車軌跡計算,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 一文搞懂C# 數(shù)據(jù)類型

    一文搞懂C# 數(shù)據(jù)類型

    這篇文章主要介紹C# 數(shù)據(jù)類型的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • c#通用登錄模塊分享

    c#通用登錄模塊分享

    這是一款簡單的ASP.NETC#注冊登錄模塊制作思路,非常簡單實用,雖然沒怎么考慮登陸的安全性,但作為C#的朋友學(xué)習(xí)交流使用。
    2016-07-07
  • c#使用資源文件的示例

    c#使用資源文件的示例

    對于資源文件的使用,說白點就是通過強制類型轉(zhuǎn)換,將資源文件里的數(shù)據(jù)強行的轉(zhuǎn)換成你需要的,換種方式說,就是你原來存進去什么,就用什么類型拿出來,下面我們學(xué)習(xí)一下c#使用資源文件的方法
    2014-01-01
  • C#中把日志導(dǎo)出到txt文本的簡單實例

    C#中把日志導(dǎo)出到txt文本的簡單實例

    這篇文章介紹了C#中把日志導(dǎo)出到txt文本的簡單實例,有需要的朋友可以參考一下
    2013-10-10
  • WPF使用DrawingContext實現(xiàn)繪制刻度條

    WPF使用DrawingContext實現(xiàn)繪制刻度條

    這篇文章主要為大家詳細介紹了如何利用WPF DrawingContext實現(xiàn)繪制刻度條,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-09-09
  • C#實現(xiàn)微信分賬功能的完整步驟

    C#實現(xiàn)微信分賬功能的完整步驟

    這篇文章主要給大家介紹了關(guān)于C#實現(xiàn)微信分賬功能的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#中的多線程超時處理實踐方案

    C#中的多線程超時處理實踐方案

    這篇文章主要介紹了C#中的多線程超時處理實踐方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • C#使用Selenium+PhantomJS抓取數(shù)據(jù)

    C#使用Selenium+PhantomJS抓取數(shù)據(jù)

    本文主要介紹了C#使用Selenium+PhantomJS抓取數(shù)據(jù)的方法步驟,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02

最新評論