• N-皇后问题的C#实现


     1 /*
     2             n-皇后问题:
     3          n皇后问题等于在n*n格的棋盘上防止彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之
     4          处在同一行或同一列或同一斜线上的棋子,求解可以放置的方法种数。
     5         */
     6         private static int count = 0;
     7         static void Main(string[] args)
     8         {
     9             while (true)
    10             {
    11                 Console.WriteLine("请输入大于3的数,将会显示所有满足皇后问题的解...");
    12                 int n = Convert.ToInt32(Console.ReadLine());
    13                 List<int> queens = new List<int>();
    14                 for (int i = 0; i < n; i++)
    15                 {
    16                     queens.Add(0);
    17                 }
    18                 Console.WriteLine("{0}-皇后问题的解:",n);
    19                 PutQueens(queens, 0);
    20             }
    21         }
    22         /// <summary>
    23         /// 安排皇后位置是判断是否会相互攻击
    24         /// </summary>
    25         /// <param name="queens">皇后列表</param>
    26         /// <param name="current">当前皇后索引</param>
    27         /// <returns></returns>
    28         private static bool IsMatch(List<int> queens, int current)
    29         {
    30             for (int i = 0; i < current; i++)
    31             {
    32                 if (queens[i] == queens[current] || Math.Abs(queens[i] - queens[current]) == Math.Abs(i - current))
    33                 {
    34                     return false;
    35                 }
    36             }
    37             return true;
    38         }
    39         /// <summary>
    40         /// 放皇后
    41         /// </summary>
    42         /// <param name="queens">皇后列表</param>
    43         /// <param name="current">当前皇后索引</param>
    44         private static void PutQueens(List<int> queens,int current)
    45         {
    46             int n = queens.Count;
    47             for (queens[current] = 1; queens[current] <= n;queens[current]++ )
    48             {
    49                 if (IsMatch(queens, current))
    50                 {
    51                     //当前位置满足情况,不会被攻击,换下一个皇后进场
    52                     current++;
    53                     if (current < n)
    54                     {
    55                         PutQueens(queens, current);
    56                     }
    57                     else
    58                     {
    59                         count++;
    60                         Console.WriteLine("第{0}中方法:",count);
    61                         for (int i = 0; i < queens.Count; i++)
    62                         {
    63                             Console.Write(queens[i].ToString()+"  ");
    64                         }
    65                         Console.WriteLine();
    66                     }
    67                     //递归结束后current--,退出所有的递归current又变成0,进行下一轮
    68                     current--;
    69                 }
    70             }
    71         }
  • 相关阅读:
    主线程到子线程的相互切换
    IOS通过OTA部署App
    IOS应用之间调用
    静态库详解
    ObjectC的函数调用机制详解消息
    iOS6新特征:参考资料和示例汇总
    杭电acm2025
    杭电acm2051
    杭电acm1009
    杭电acm2099
  • 原文地址:https://www.cnblogs.com/pushudepu/p/6005701.html
Copyright © 2020-2023  润新知