• 回溯实现八皇后问题(C#)


    以下利用回溯解决八皇后问题。总共有92种结果。 PrintQueen 是打印函数,isConfict 是用来判断是否冲突(在同一直线和斜线则有冲突)

    EightQueen 为主函数,

    算法思路: 先把第一个皇后放在(0,0)的位置。然后从第一行往下找,如果成功,则继续往下探索。一直到第八行,然后回溯。

    如果回溯到第一行,说明第一个皇后在(0,0)的所有情况全部已经列出。接着遍历(0,1)一直到(0,7)

    public class Program

    {

    static int count = 0;

    static int[] chess = new int[8]{-1,-1,-1,-1,-1,-1,-1,-1};

    static void PrintQueen()

    {

    Console.WriteLine(string.Format("========{0}==============", count));

    for (int i = 0; i < 8; i++)

    {



    int m = 0;

    int n = chess[i] + 1;

    while (m < chess[i])

    {

    Console.Write("* ");

    m++;

    }

    Console.Write("@ ");

    while (n < 8)

    {

    Console.Write("* ");

    n++;

    }

    Console.WriteLine("");



    }

    Console.WriteLine("=======================");

    }



    static bool isConfict(int x2, int y2)

    {

    int x1, y1;

    for (int i = 0; i < x2; i++)

    {

    x1 = i;

    y1 = chess[i];

    if (y1 == y2 || (x1 - y1 == x2 - y2) || (x1 + y1 == x2 + y2))

    return true;

    }

    return false;

    }



    static void EightQueen()

    {

    int column = 0;

    int i = 0;

    int t = 0;

    int k = 0;

    int z = 0;

    while (column < 8)

    {

    chess[0] = column;

    int m;

    for (m = t; m < 8; m++)

    {

    k = i + 1;

    chess[k] = m;

    if (isConfict(k, m))//冲突就停止

    {

    continue;

    }

    else

    {

    z = m + 1; //保存上次找到的合法位置,以备回溯的时候当做起点。

    i++;

    m = -1;

    }

    if (i >= 7) // 成功也要回溯

    {

    count++;

    PrintQueen();

    i--;// 回溯

    m = z;

    continue;

    }

    if (i <= 0) // 如果回溯到了第一行,column++

    {

    column++;

    i = 0; t = 0; k = 0;

    break;

    }

    }

    if (m >= 8 ) //失败

    {

    t = chess[i + 1] + 1;

    if (t == 8)

    {

    i--; // 回溯到上一层

    }

    }

    if (i < -1)

    break;



    }

    Console.WriteLine("Done");

    }

    static void Main()

    {

    EightQueen();

    }

    }
  • 相关阅读:
    poj 1061 (扩展欧几里德算法)
    字符串 (扫一遍 + 计数)
    快排 + 二分
    勾股定理
    WD
    Acmer--弱水三千,只取一瓢
    朱光潜给青年的十二封信 之 谈升学和选课
    朱光潜给青年的十二封信 之 谈读书
    小白书--求 n!
    N阶行列式---常见的几种运算
  • 原文地址:https://www.cnblogs.com/zhangjiang/p/2396119.html
Copyright © 2020-2023  润新知