程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#用遞歸算法處理八皇後成績

C#用遞歸算法處理八皇後成績

編輯:C#入門知識

C#用遞歸算法處理八皇後成績。本站提示廣大學習愛好者:(C#用遞歸算法處理八皇後成績)文章只能為提供參考,不一定能成為您想要的結果。以下是C#用遞歸算法處理八皇後成績正文


1.引子

  中國有一句古話,叫做“不撞南牆不回頭",活潑的解釋了一小我的執拗,有點褒義,然則在軟件編程中,這類思緒確是一種處理成績最簡略的算法,它經由過程一品種似於蠻干的思緒,一步一步地往前走,每走一步都更接近目的成果一些,直到碰到妨礙物,我們才斟酌往回走。然後再持續測驗考試向前。經由過程如許的海浪式進步辦法,終究到達目標地。固然全部進程須要許多往復,如許的進步方法,效力比擬低下。

2.實用規模

  實用於那些不存在簡明的數學模子以說明成績的實質,或許存在數學模子,然則難於完成的成績。

3.運用場景

  在8*8國際象棋棋盤上,請求在每行放置一個皇後,且能做到在豎偏向,斜偏向都沒有抵觸。國際象棋的棋盤以下圖所示:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810434038.jpg

4.剖析

  根本思緒如下面剖析分歧,我們采取慢慢摸索的方法,先從一個偏向往前走,能進則進,不克不及進則退,測驗考試別的的途徑。起首我們來剖析一下國際象棋的規矩,這些規矩可以或許限制我們的進步,也就是我們進步途中的妨礙物。一個皇後q(x,y)能被知足以下前提的皇後q(row,col)吃失落

1)x=row(在縱向不克不及有兩個皇後)

2)y=col(橫向)

3)col + row = y+x;(斜向正偏向)

4)col - row = y-x;(斜向反偏向)

碰到上述成績之一的時刻,解釋我們曾經碰到了妨礙,不克不及持續向前了。我們須要退回來,測驗考試其他途徑。

我們將棋盤看做是一個8*8的數組,如許可使用一種蠻干的思緒去處理這個成績,如許我們就是在8*8=64個格子中掏出8個的組合,C(64,80) = 4426165368,明顯這個數異常年夜,在蠻干的基本上我們可以增長回溯,從第0列開端,我們逐列停止,從第0行到第7行找到一個不受任何曾經現有皇後進擊的地位,而第五列,我們會發明找不到皇後的平安地位了,後面四列的擺放以下:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810434088.png

第五列的時刻,擺聽任何行都邑上圖所示曾經存在的皇後的進擊,這時候候我們以為我們撞了南牆了,是回頭的時刻了,我們撤退退卻一列,將本來擺放在第四列的皇後(3,4)拿走,從(3,4)這個地位開端,我們再第四列中尋覓下一個平安地位為(7,4),再持續到第五列,發明第五列依然沒有平安地位,回溯到第四列,此時第四列也是一個逝世胡同了,我們再回溯到第三列,如許進步幾步,回退一步,終究直到在第8列上找到一個平安地位(勝利)或許第一列曾經是逝世胡同,然則第8列依然沒有找到平安地位為止

總結一下,用回溯的辦法處理8皇後成績的步調為:

1)從第一列開端,為皇後找到平安地位,然後跳到下一列

2)假如在第n列湧現逝世胡同,假如該列為第一列,棋局掉敗,不然撤退退卻到上一列,在停止回溯

3)假如在第8列上找到了平安地位,則棋局勝利。

8個皇後都找到了平安地位代表棋局的勝利,用一個長度為8的整數數組queenList代表勝利擺放的8個皇後,數組索引代表棋盤的col向量,而數組的值為棋盤的row向

量,所以(row,col)的皇後可以表現為(queenList[col],col),如上圖中的幾個皇後可表現為:

queenList[0] = 0;  queenList[1] = 3;   queenList[2] = 1;  queenList[3] = 4;   queenList = 2;

我們看一下若何設計法式:

起首斷定(row,col)能否是平安地位的算法:

bool IsSafe(int col,int row,int[] queenList)
{
 //只檢討後面的列
 for (int tempCol = 0; tempCol < col; tempCol++)
 {
  int tempRow = queenList[tempCol];
  if (tempRow == row)
  {
   //統一行
   return false;
  }
  if (tempCol == col)
  {
   //統一列
   return false;
  }
  if (tempRow - tempCol == row - col || tempRow + tempCol == row + col)
  {
   return false;
  }
 }
 return true;
}

設定一個函數,用於查找col列後的皇後擺放辦法:

/// <summary>
/// 在第col列尋覓平安的row值
/// </summary>
/// <param name="queenList"></param>
/// <param name="col"></param>
/// <returns></returns>
public bool PlaceQueue(int[] queenList, int col)
{
 int row = 0;
 bool foundSafePos = false;
 if (col == 8) //停止標記
 {
  //當處置完第8列的完成
  foundSafePos = true;
 }
 else
 {
  while (row < 8 && !foundSafePos)
  {
   if (IsSafe(col, row, queenList))
   {
    //找到平安地位
    queenList[col] = row;
    //找下一列的平安地位
    foundSafePos = PlaceQueue(queenList, col + 1);
    if (!foundSafePos)
    {
     row++;
    }
   }
   else
   {
    row++;
   }
  }
 }
 return foundSafePos;
}

挪用辦法:

static void Main(string[] args)
{
 EightQueen eq = new EightQueen();
 int[] queenList = new int[8];
 for (int j = 0; j < 8; j++)
 {
  Console.WriteLine("-----------------"+j+"---------------------");
  queenList[0] = j;
  bool res = eq.PlaceQueue(queenList, 1);

  if (res)
  {
   Console.Write(" ");  
   for (int i = 0; i < 8; i++)
   {
    Console.Write(" " + i.ToString() + " ");  
   }
   Console.WriteLine("");
   for (int i = 0; i < 8; i++)
   {
    Console.Write(" "+i.ToString()+" ");      
    for (int a = 0; a < 8; a++)
    {       
     if (i == queenList[a])
     {
      Console.Write(" q ");
     }
     else
     {
      Console.Write(" * ");
     }
    }
    Console.WriteLine("");
      
   }
   
   Console.WriteLine("---------------------------------------");
  }
  else
  {
   Console.WriteLine("不克不及完成棋局,棋局掉敗!");
  }
 }
 Console.Read();
}

遞歸算法PlaceQueue,完成如許的功效:它尋覓第col列後的皇後的平安擺放地位,假如該函數前往了false,表現以後進入了逝世胡同,須要停止回溯,直到為0-7列都找

到了平安地位或許找遍這些列都找不到平安地位的時刻終止。

用遞歸算法處理8皇後成績的示例法式:

http://xiazai.jb51.net/201606/yuanma/EightQueens(jb51.net).rar

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved