我这个代码是跟着小甲鱼之前发的视频来编写的,他用的是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 + "种摆放方法");
}
}
}
https://www.cnblogs.com/LanTianYou/p/4963660.html
#include<bits/stdc++.h>
using namespace std;
bool d[16]={0},b[9]={0},c[16]={0};
short tot,sum,a[9];
int search(int);
int print();
int main()
{
//tot=0;
search(1);
//cout<<tot;
}
int search(int i){
int j;
for(j=1;j<=8;j++)
if((!b[j])&&(!c[i+j])&&(!d[i-j+7]))
{
a[i]=j;
b[j]=1;
c[i+j]=1;
d[i-j+7]=1;
if(i==8)print();
else search(i+1);
b[j]=0;
c[i+j]=0;
d[i-j+7]=0;
}
//return 0;
}
int print()
{
int i;
sum++;//tot=tot+1;
cout<<"sun="<<sum<<endl;
for(i=1;i<=8;i++)
cout<<setw(4)<<a[i];
cout<<endl;
//return 0;
}
望采纳