当前位置:   article > 正文

C#,动态规划(DP)N皇后问题(N Queen Problem)的回溯(Backtracking)算法与源代码_package com.lsn.nqueen;如何添加到c#方法

package com.lsn.nqueen;如何添加到c#方法

1 N皇后问题(N Queen Problem)

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

2 回溯算法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

回溯法也称试探法,它的基本思想是:从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。

3 源程序

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// N皇后问题
    /// </summary>
    public static partial class Algorithm_Gallery
    {
        private static bool NQP_IsSafe(int[,] board, int row, int col)
        {
            int N = board.GetLength(0);
            for (int i = 0; i < col; i++)
            {
                if (board[row, i] == 1)
                {
                    return false;
                }
            }
            for (int i = row, j = col; i >= 0 && j >= 0; i--, j--)
            {
                if (board[i, j] == 1)
                {
                    return false;
                }
            }
            for (int i = row, j = col; j >= 0 && i < N; i++, j--)
            {
                if (board[i, j] == 1)
                {
                    return false;
                }
            }
            return true;
        }

        private static bool NQP_Utility(ref int[,] board, int col)
        {
            int N = board.GetLength(0);
            if (col >= N)
            {
                return true;
            }
            for (int i = 0; i < N; i++)
            {
                if (NQP_IsSafe(board, i, col))
                {
                    board[i, col] = 1;

                    if (NQP_Utility(ref board, col + 1) == true)
                    {
                        return true;
                    }
                    board[i, col] = 0;
                }
            }
            return false;
        }

        public static bool NQP_Solve(int n,out int[,] board)
        {
            board = new int[n, n];            

            if (NQP_Utility(ref board, 0) == false)
            {
                return false;
            }

            return true;
        }

        public static string ToHtml(int[,] board)
        {
            int N = board.GetLength(0);
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("<style>");
            sb.AppendLine("td { padding:5px;text-align:center; }");
            sb.AppendLine("</style>");
            sb.AppendLine("<table border=1 bordercolor='#999999' style='border-collapse:collapse;'>");
            for (int i = 0; i < N; i++)
            {
                sb.AppendLine("<tr>");
                for (int j = 0; j < N; j++)
                {
                    sb.AppendLine("<td>" + board[i, j] + "</td>");
                }
                sb.AppendLine("</tr>");
            }
            sb.AppendLine("</table>");
            return sb.ToString();
        }
    }
}
 

————————————————————————————————

POWER BY 315SOFT.COM

4 源代码

  1. using System;
  2. using System.Text;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. namespace Legalsoft.Truffer.Algorithm
  6. {
  7.     /// <summary>
  8.     /// N皇后问题
  9.     /// </summary>
  10.     public static partial class Algorithm_Gallery
  11.     {
  12.         private static bool NQP_IsSafe(int[,] board, int row, int col)
  13.         {
  14.             int N = board.GetLength(0);
  15.             for (int i = 0; i < col; i++)
  16.             {
  17.                 if (board[row, i] == 1)
  18.                 {
  19.                     return false;
  20.                 }
  21.             }
  22.             for (int i = row, j = col; i >= 0 && j >= 0; i--, j--)
  23.             {
  24.                 if (board[i, j] == 1)
  25.                 {
  26.                     return false;
  27.                 }
  28.             }
  29.             for (int i = row, j = col; j >= 0 && i < N; i++, j--)
  30.             {
  31.                 if (board[i, j] == 1)
  32.                 {
  33.                     return false;
  34.                 }
  35.             }
  36.             return true;
  37.         }
  38.         private static bool NQP_Utility(ref int[,] board, int col)
  39.         {
  40.             int N = board.GetLength(0);
  41.             if (col >= N)
  42.             {
  43.                 return true;
  44.             }
  45.             for (int i = 0; i < N; i++)
  46.             {
  47.                 if (NQP_IsSafe(board, i, col))
  48.                 {
  49.                     board[i, col] = 1;
  50.                     if (NQP_Utility(ref board, col + 1) == true)
  51.                     {
  52.                         return true;
  53.                     }
  54.                     board[i, col] = 0;
  55.                 }
  56.             }
  57.             return false;
  58.         }
  59.         public static bool NQP_Solve(int n,out int[,] board)
  60.         {
  61.             board = new int[n, n];            
  62.             if (NQP_Utility(ref board, 0) == false)
  63.             {
  64.                 return false;
  65.             }
  66.             return true;
  67.         }
  68.         public static string ToHtml(int[,] board)
  69.         {
  70.             int N = board.GetLength(0);
  71.             StringBuilder sb = new StringBuilder();
  72.             sb.AppendLine("<style>");
  73.             sb.AppendLine("td { padding:5px;text-align:center; }");
  74.             sb.AppendLine("</style>");
  75.             sb.AppendLine("<table border=1 bordercolor='#999999' style='border-collapse:collapse;'>");
  76.             for (int i = 0; i < N; i++)
  77.             {
  78.                 sb.AppendLine("<tr>");
  79.                 for (int j = 0; j < N; j++)
  80.                 {
  81.                     sb.AppendLine("<td>" + board[i, j] + "</td>");
  82.                 }
  83.                 sb.AppendLine("</tr>");
  84.             }
  85.             sb.AppendLine("</table>");
  86.             return sb.ToString();
  87.         }
  88.     }
  89. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/161866?site
推荐阅读
相关标签
  

闽ICP备14008679号