我这个代码是跟着小甲鱼之前发的视频来编写的,他用的是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 + "种摆放方法");
}
}
}