⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chess.cpp

📁 设在初始状态下在国际象棋棋盘上没有任何棋子(皇后)。然后顺序在第1行
💻 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 + -