八皇后问题 c# 实现

 代码:

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

namespace EightQueen
{
    class Program
    {
        static void Main(string[] args)
        {
            InitBoard(board);
            HasPlacedQueen(0, 0, 0);
            PrintBoard();
            Console.Read();
        }

        static int N=8;

        static char[,] board = new char[N, N];
        private static int HasPlacedQueen(int locX, int locY, int queenNum)
        {
            int result = 0;
            if (queenNum == N)           
                return 1;
            else
                if (CanPlaceQueen(locX, locY))
                {
                    board[locX, locY] = 'q';
                    /
                    for (int i = 0; i < N; i++)                   
                        for (int j = 0; j < N; j++)
                        {
                            result += HasPlacedQueen(i, j, queenNum + 1);
                            if (result > 0)
                            {
                                break;
                            }
                        }

                        if (result > 0)                      
                            return 1;                       
                        else
                        {
                            board[locX, locY] = 'x';
                            return 0;
                        }                 

                }
                else               
                    return 0;              
           
        }

        private static bool CanPlaceQueen(int locX, int locY)
        {      

            int i = 0, j = 0;

            if (board[locX, locY] != 'x')
            {
                return false;
            }

            上方
            for (j = locY - 1; j >= 0; j--)
            {
                if (board[locX, j] != 'x')
                {
                    return false;
                }
            }

            下方
            for (j = locY + 1; j < N; j++)
            {
                if (board[locX, j] != 'x')
                {
                    return false;
                }
            }

            左方
            for (i = locX - 1; i >= 0; i--)
            {
                if (board[i, locY] != 'x')
                {
                    return false;
                }
            }

            右边
            for (i = locX + 1; i < N; i++)
            {
                if (board[i, locY] != 'x')
                {
                    return false;
                }
            }

            左上方
            i=locX-1;
            j = locY - 1;
            while (i >= 0 && j >= 0)
            {
                if (board[i--,j--] != 'x')
                {
                    return false;
                }
            }

            右上方
            i = locX + 1;
            j = locY - 1;
            while (i < N && j >= 0)
            {
                if (board[i++,j--] != 'x')
                {
                    return false;
                }
            }

            左下方
            i = locX - 1;
            j = locY + 1;
            while (i >= 0 && j < N)
            {
                if (board[i--,j++] != 'x')
                {
                    return false;
                }

            }

            i = locX + 1;
            j = locY + 1;
            while (i < N && j < N)
            {
                if (board[i++,j++] != 'x')
                {
                    return false;
                }
            }

            return true;        
        
        }

        private static void InitBoard(char [,] board)
        {
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    board[i, j] = 'x';
                }
            }
       
        }

        private static void PrintBoard()
        {
            for (int i = 0; i < N; i++)
            {
                Console.Write("  " + i + "  ");
            }
            Console.WriteLine();

            for (int i = 0; i < N; i++)
            {
                Console.Write(" "+ "---");
            }
            Console.WriteLine();

            for (int i = 0; i < N; i++)
            {
                Console.Write(" " + i);
                for (int j = 0; j < N; j++)
                {
                    Console.Write("-{0}-|", board[i, j]);
                }
                Console.WriteLine();
                //Console.Write("+");
                //for (int k = 0; k < N; k++)
                //{
                //    Console.Write("---+");
                //}
                //Console.WriteLine();
               
           
            }

        
        }

 


    }
}

 

 

 

 

//非递归

 

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

namespace EightQueen
{
    class Program
    {
        static int N = 2;
        static char[,] board = new char[N, N];
        static Stack<Pair> queenStack = new Stack<Pair>();
        public class Pair
        {
            public int x;
            public int y;
            public Pair(int a, int b)
            {
                x = a;
                y = b;
            }
        }

        static void Main(string[] args)
        {          

            InitBoard(board);
            TryPlaceQueen();
            PrintBoard();
            Console.Read();
        }      

      
        private static void TryPlaceQueen()
        {
           

            Pair current = new Pair(0, 0);
            Pair nextPair = new Pair(0, 0);
            while (queenStack.Count < N)
            {
                current = nextPair;

                if (CanPlaceQueen(current.x, current.y))
                {
                    queenStack.Push(current);
                    board[current.x, current.y] = 'Q';
                    nextPair = GetNextLine(current);
                    continue;


                }
                else
                {                                                              
                        while(current.y ==N-1 && queenStack.Count>0)
                      
                        {
                            current = queenStack.Pop();
                            board[current.x, current.y] = 'x';                           
                        }

                        nextPair = GetNext(current);                  
                }
            }

            while (queenStack.Count > 0)
            {
                Pair queen = queenStack.Pop();
                board[queen.x, queen.y] = 'Q';
            }         

        }

        private static Pair GetNext(Pair current)
        {
            Pair target = new Pair(current.x, current.y);
            int targetY = current.y + 1;
            if (targetY == N)
            {
                target.x += 1;
                target.y = 0;
            }
            else
            {
                target.y += 1;
            }          
           
            return target;
        }

        private static Pair GetNextLine(Pair current)
        {
            Pair target = new Pair(current.x,current.y);

            target.x = current.x + 1;
            target.y = 0;

            return target;
        }

      

        private static int HasPlacedQueen(int locX, int locY, int queenNum)
        {
            int result = 0;
            if (queenNum == N)           
                return 1;
            else
                if (CanPlaceQueen(locX, locY))
                {
                    board[locX, locY] = 'q';
                    /
                    for (int i = 0; i < N; i++)                   
                        for (int j = 0; j < N; j++)
                        {
                            result += HasPlacedQueen(i, j, queenNum + 1);
                            if (result > 0)
                            {
                                break;
                            }
                        }

                        if (result > 0)                      
                            return 1;                       
                        else
                        {
                            board[locX, locY] = 'x';
                            return 0;
                        }                 

                }
                else               
                    return 0;              
           
        }

        private static bool CanPlaceQueen(int locX, int locY)
        {      

            int i = 0, j = 0;

            if (board[locX, locY] != 'x')
            {
                return false;
            }

            上方
            for (j = locY - 1; j >= 0; j--)
            {
                if (board[locX, j] != 'x')
                {
                    return false;
                }
            }

            下方
            for (j = locY + 1; j < N; j++)
            {
                if (board[locX, j] != 'x')
                {
                    return false;
                }
            }

            左方
            for (i = locX - 1; i >= 0; i--)
            {
                if (board[i, locY] != 'x')
                {
                    return false;
                }
            }

            右边
            for (i = locX + 1; i < N; i++)
            {
                if (board[i, locY] != 'x')
                {
                    return false;
                }
            }

            左上方
            i=locX-1;
            j = locY - 1;
            while (i >= 0 && j >= 0)
            {
                if (board[i--,j--] != 'x')
                {
                    return false;
                }
            }

            右上方
            i = locX + 1;
            j = locY - 1;
            while (i < N && j >= 0)
            {
                if (board[i++,j--] != 'x')
                {
                    return false;
                }
            }

            左下方
            i = locX - 1;
            j = locY + 1;
            while (i >= 0 && j < N)
            {
                if (board[i--,j++] != 'x')
                {
                    return false;
                }

            }


            右下
            i = locX + 1;
            j = locY + 1;
            while (i < N && j < N)
            {
                if (board[i++,j++] != 'x')
                {
                    return false;
                }
            }

            return true;        
        
        }

        private static void InitBoard(char [,] board)
        {
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    board[i, j] = 'x';
                }
            }
       
        }

        private static void PrintBoard()
        {
            for (int i = 0; i < N; i++)
            {
                Console.Write("  " + i + "  ");
            }
            Console.WriteLine();

            for (int i = 0; i < N; i++)
            {
                Console.Write(" "+ "---");
            }
            Console.WriteLine();

            for (int i = 0; i < N; i++)
            {
                Console.Write(" " + i);
                for (int j = 0; j < N; j++)
                {
                    Console.Write("-{0}-|", board[i, j]);
                }
                Console.WriteLine();
           
            }

        
        }

 


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值