关于使用C#来编写利用递归实现八皇后问题

我这个代码是跟着小甲鱼之前发的视频来编写的,他用的是c语言,我想用c#编写一下试试,结果结果一直都不对,和c语言代码对照了好几次也没有发现问题,我用了相同的思路用c++编写答案也是正确的,希望各位大佬帮助一下
代码如下

using System;

namespace 递归实现八皇后问题
{
    class Program
    {
        static int count = 0;
        static bool IsSafe(int row, int j, int[,] chess)
        {  
            bool flag1 = false, flag2 = false, flag3 = false, flag4 = false, flag5 = false,flag6 = false;
            //判断同行上是否有皇后
            for (int i = row;i>=0;i--)
            {
                if(chess[i,j]==1)
                {
                    flag6 = true;
                    break;
                }
            }
            //判断同列上是否有皇后
            for (int i = row; i < 8; i++)
            {
                if (chess[i, j] != 0)
                {
                    flag1 = true;
                    break;
                }
            }
            //因为代码无法直接判断一整条斜线上是否有皇后,所以分为四个部分
            //判断左上角是否有皇后
            for (int i = row, k = j; i >= 0 && k >= 0; i--, k--) 
            {
                if (chess[i, k] != 0)
                {
                    flag2 = true;
                    break;
                }
            }
            //判断右下角是否有皇后
            for (int i = row, k = j; i < 8 && k < 8; i++, k++)
            {
                if (chess[i, k] != 0)
                {
                    flag3 = true;
                    break;
                }
            }
            //判断左下角是否有皇后
            for (int i = row, k = j; i < 8 && k >= 0; i++, k--)
            {
                if (chess[i, k] != 0)
                {
                    flag4 = true;
                    break;
                }
            }
            //判断右上角是否有皇后
            for (int i = row, k = j; i >=0 && k <8; i--, k++)
            {
                if (chess[i, k] != 0)
                {
                    flag5 = true;
                    break;
                }
            }
            //最后判断
            if(flag1||flag2||flag3||flag4||flag5||flag6)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        //此处的row代表的时起始的行数,不是总行数
        static void EightQueen(int row ,int n,int[,] chess)
        {
            //创建一个新的棋盘
            int[,] chess2 = new int[8,8];
            for(int i = 0;i<8;i++)
            {
                for(int j = 0;j<8;j++)
                {
                    chess2[i,j] = chess[i,j];
                }
            }

            if (row == 8)//递归结束
            {
                Console.WriteLine("第"+(count+1)+"种");
                for (int i = 0; i < 8; i++) 
                {
                    for (int j = 0; j < 8; j++) 
                    {
                        Console.Write(chess2[i,j]+" ");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine();
                count++;
            }
            else//判断以及放入皇后棋子
            {
                for(int j=0;j<n;j++)
                {
                    if (IsSafe(row,j,chess))//这里使用IsSafe方法判断该位置是否可放入皇后棋子
                    {
                        for(int i=0;i<8;i++)
                        {
                            chess[row, i] = 0;
                        }

                        chess[row, j] = 1;

                        EightQueen(row + 1, n, chess);
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            int[,] chess = new int[8,8];
            for(int i = 0;i<8;i++)
            {
                for(int j = 0;j<8;j++)
                {
                    chess[i,j] = 0;
                }
            }
            EightQueen(0, 8, chess);
            Console.WriteLine("总共有" + count + "种摆放方法");
        }
    }
}

c#

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐