某中二的呆毛 2019-12-09 20:16 采纳率: 0%
浏览 338

关于使用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 + "种摆放方法");
        }
    }
}

  • 写回答

2条回答 默认 最新

  • threenewbee 2019-12-09 23:46
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序