📄 chess.cpp
字号:
#include<iostream>
using namespace std;
enum Boolean { Y,N };
class Chess
{
private:
int sum; //统计正确的答案
int L[8]; // 记录每一行的皇后对应的列
int a[8][8]; //棋盘上8*8格,
//下面四个函数检查 行,列,主对角线,次对角线有没有攻击
Boolean Row(int m);
Boolean Line(int n);
Boolean MainLine(int x);
Boolean SecondLine(int y);
Boolean Judge(int i,int j); //判断第i行,第j列是否有攻击
public:
void OutSum(void);
Chess(void);
void Queen(int i);
};
Chess::Chess(void)
{
int i,j;
sum=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
a[i][j]=0;
}
}
Boolean Chess::Row(int m)
{
int j;
int k=0; //1 有皇后,0没皇后
for(j=0;j<8;j++)
{
if(a[m][j]!=0)
{ k=1;} //说明有皇后,k变为1;
if(k==1)break;
}
if(k==1) return Y;
else return N;
}
Boolean Chess::Line(int n)
{
int i;
int k=0; //1 有皇后,0没皇后
for(i=0;i<8;i++)
{
if(a[i][n]!=0)
{ k=1;} //说明有皇后,k变为1;
if(k==1)break;
}
if(k==1) return Y;
else return N;
}
Boolean Chess::MainLine(int x)
{
//k = n+i-j-1
int i,j;
int k=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(x==8+i-j-1)
{ //说明找到第x主对角线的元素
if(a[i][j]==1)
k=1;
}
}
if(k==1) break;
}
if(k==1) return Y;
else return N;
}
Boolean Chess::SecondLine(int y)
{
int i,j;
int k=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(i+j==y)
{
if(a[i][j]==1)
k=1;
}
}
if(k==1) break;
}
if(k==1) return Y;
else return N;
}
Boolean Chess::Judge(int i,int j)
{
int x,y;
x=8+i-j-1; //i,j对应的主对角线
y=i+j;
if(Row(i)==N && Line(j)==N && MainLine(x)==N && SecondLine(y)==N )
return N; //没有攻击
else
return Y; //有攻击
}
void Chess::OutSum(void)
{
cout<<"符合条件的布局有"<<sum<<"种"<<endl;
}
void Chess::Queen(int i)
{
char ch;
int j;
for(j=0;j<8;j++)
{
if(Judge(i,j)==N)
{
a[i][j]=1;
L[i]=j; //皇后在第i行的第j列
if(i==7) //当八行都安放皇后就输出布局
{ int m,n;
sum+=1;
ch='a';
for(m=0;m<8;m++)
{
for(n=0;n<8;n++)
{
cout<<a[m][n]<<" ";
}
cout<<" "<<ch<<L[m]+1<<endl;
ch++;
}
cout<<endl<<endl;
}
else
Queen(i+1);
j=L[i];
a[i][j]=0;
}
}
}
void main()
{
freopen("bahuang.txt","w",stdout); //打印到 bahuang.txt
cout<<" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "<<endl
<<" ! 八皇问题 ! "<<endl
<<" ! 0表示没有皇后,1表示有皇后 ! "<<endl
<<" ! 名:卡米力江 学号:0610210010 ! "<<endl
<<" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "<<endl<<endl;
Chess c;
c.Queen(0);
c.OutSum();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -