`

皇后问题

阅读更多

/*
 *Author:Junyi Sun @CCNU
* E-mail:fxsjy@yahoo.com.cn
*/

using System;
namespace sunjoy
{
    public class Queen
    {
        public static int Main()
        {
            int board_size = 0,x=0,y=0;//棋盘大小,当前行,当前列
            uint solution_count = 0;   //皇后摆放方案的个数
            int[] rows, cols, slot1, slot2, x2y;//行占用情况,列占用情况,“/”状斜线占用情况,“\”状斜线占用情况,皇后坐标
            DateTime t_start, t_end;
           
            Console.WriteLine("请输入棋盘的大小");
            try
            {
                board_size = Convert.ToInt32(Console.ReadLine());
                if (board_size <= 0)
                {
                    Console.WriteLine("非法数据");
                    return -1;
                }
            }
            catch (Exception e) { Console.WriteLine("发生异常" + e.Message); };

            rows = new int[board_size];
            cols = new int[board_size];
            slot1 = new int[board_size * 2 - 1];
            slot2 = new int[board_size * 2 - 1];
            x2y = new int[board_size];

            for (int i = 0; i < board_size; i++)
                x2y[i] = -1;   //坐标初始化都为-1
            t_start = DateTime.Now;
            while (true)
            {
                for (y = x2y[x]+1; y < board_size; y++)
                    if (rows[x] == 0 && cols[y] == 0 && slot1[x + y] == 0 && slot2[x - y + board_size - 1] == 0)
                        break;

                if (y < board_size)
                {
                    //第X行的棋子落下
                    rows[x] = 1; cols[y] = 1; slot1[x + y] = 1; slot2[x - y + board_size - 1] = 1; x2y[x] = y;
                }  
                else
                {
                    //回溯,拿起棋子
                    if (x > 0)
                    {
                        x2y[x] = -1;
                        x--;
                        rows[x] = 0; cols[x2y[x]] = 0; slot1[x + x2y[x]] = 0; slot2[x - x2y[x] + board_size - 1] = 0;
                        continue;
                    }
                    else break;
                }
                if (x == board_size - 1)   //如果已经得到了一组解,即当最后一行棋子落定之时
                {
                    for (int i = 0; i < board_size; i++)
                    {
                        for (int j = 0; j < board_size; j++)
                        {
                            if (x2y[i] == j) Console.Write("Q");
                            else Console.Write("■");
                        }
                        Console.Write("\n");
                       
                    }
                    Console.Write("\n");
                    solution_count++;   //总方案数加一
                    rows[x] = 0; cols[x2y[x]] = 0; slot1[x + x2y[x]] = 0; slot2[x - x2y[x] + board_size - 1] = 0;//放弃这一列

                }
                else
                {
                    x++;   //继续处理下一行
                }
            }
            t_end = DateTime.Now;
            Console.WriteLine("总共{0}组解",solution_count);
            Console.WriteLine("计算及打印共用时间{0}秒",t_end-t_start);
            return 0;
        }
    }
}

___________________________________________________________

测试结果:
请输入棋盘的大小
4
■Q■■
■■■Q
Q■■■
■■Q■

■■Q■
Q■■■
■■■Q
■Q■■

总共2组解
计算及打印共用时间00:00:00秒

_______________________________________________
请输入棋盘的大小
6
■Q■■■■
■■■Q■■
■■■■■Q
Q■■■■■
■■Q■■■
■■■■Q■

■■Q■■■
■■■■■Q
■Q■■■■
■■■■Q■
Q■■■■■
■■■Q■■

■■■Q■■
Q■■■■■
■■■■Q■
■Q■■■■
■■■■■Q
■■Q■■■

■■■■Q■
■■Q■■■
Q■■■■■
■■■■■Q
■■■Q■■
■Q■■■■

总共4组解
计算及打印共用时间00:00:00.0156250秒

 
分享到:
评论

相关推荐

    图形化N皇后问题解法及分析实验

    八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题...

    用栈求解n皇后问题 ,经典的回溯算法问题

    n 皇后问题是一道经典的回溯算法问题,其目标是在一个 � × � n×n 的棋盘上放置 � n 个皇后,使得任意两个皇后都不能在同一行、同一列或同一斜线上。 栈可以用来辅助实现回溯算法,本质上就是手动维护了递归...

    n皇后问题C++源码

    n皇后问题C++源码。{典型的8皇后问题的扩展)

    8皇后问题 8皇后问题 8皇后问题

    8皇后问题 8皇后问题 8皇后问题

    N皇后问题代码

    n皇后问题代码 回溯法 递归回溯 算法设计与分析

    C++八皇后问题代码,递归实现

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...

    回溯算法求解 八皇后问题

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    八皇后问题 c++ 八皇后问题 c++

    八皇后问题 c++ 八皇后问题 c++ 八皇后问题 c++

    八皇后问题源码 python

    解决八皇后问题的源码,带有注释,由于数据结构即算法的学习,如有其他需要,请留言

    八皇后问题 C语言

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...

    8皇后问题c++代码

    很简单,很好用的代码,用于解决八皇后问题(八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即...

    八皇后问题 递归算法 可以输入皇后的值

    八皇后问题 递归算法 可以输入皇后的值 输出排列的结果

    八皇后问题课程设计论文

    八皇后问题课程设计论文

    n皇后问题的求解n皇后问题的求解

    n皇后问题 Very Goodn皇后问题的求解n皇后问题的求解

    回溯算法实现5皇后问题

    回溯实现n后问题,用c语言实现,默认定义皇后个数为五个,可以自己定义,输出排列结果,本程序只是简单的利用回溯法实现五皇后问题,

    算法设计与分析——皇后问题

    使用递归方法解决了n皇后问题,初学递归的朋友可以参考一下!

    8皇后问题算法实现

    8皇后问题算法实现,基于Java的8皇后问题

    四皇后问题-递归实现

    四皇后问题的递归实现,简单易懂,适合学习人工智能

    n皇后问题之不同解

    利用分支限界法来实现该问题只要是问题你懂得皇后问题求解(8) a) 皇后个数的设定 在指定文本框内输入皇后个数即可,注意: 皇后个数在8和1000 之间(包括8和1000) b) 求解 点击按钮即可进行求解. c) 求解过程显示 在标...

    汇编解决八皇后问题

    作业代码,汇编写八皇后问题,自己写了一份,在网上找的也在里面

Global site tag (gtag.js) - Google Analytics