/**************************************
--修改日期: 2009.5.30
--修改人: 吴强
--修改原因: 从前写的代码不够规范
--输入要求:
***************************************/
#include
char cChessboard[8][8]; /*棋盘*/
int n=0;
void gongjiFW(int x, int y, char cEmpress) /*设皇后的攻击范围*/
{
char c;
int heng;
int shu;
int i;
int j;
//转换成小写字母,表示攻击范围
c=cEmpress+'a'-'A';
//横向攻击范围
for ( heng=0; heng<8; heng++ )
{
if ( cChessboard[x][heng]=='0' )
{
cChessboard[x][heng]=c;
}
}
//纵向攻击范围
for ( shu=x; shu<8; shu++)
{
if ( cChessboard[shu][y]=='0' )
{
cChessboard[shu][y]=c;
}
}
//往左下方向攻击范围
for ( i=x,j=y; i<8 && j>=0; i++,j--)
{
if ( cChessboard[i][j]=='0' )
{
cChessboard[i][j]=c;
}
}
//往右下方向的攻击范围
for ( i=x,j=y; i<8 && j<8; i++,j++)
{
if ( cChessboard[i][j]=='0' )
{
cChessboard[i][j]=c;
}
}
}
void quxiaoFW(int x,int y,char cEmpress) /*拿掉皇后后,取消其攻击范围*/
{
char c;
int heng;
int shu;
int i;
int j;
c=cEmpress+'a'-'A';
for ( heng=0; heng<8; heng++ )
{
if ( cChessboard[x][heng]==c )
{
cChessboard[x][heng]='0';
}
}
for ( shu=x;shu<8;shu++ )
{
if ( cChessboard[shu][y]==c )
{
cChessboard[shu][y]='0';
}
}
for ( i=x,j=y; i<8 && j>=0; i++,j--)
{
if ( cChessboard[i][j]==c )
{
cChessboard[i][j]='0';
}
}
for ( i=x,j=y; i<8 && j<8; i++,j++)
{
if ( cChessboard[i][j]==c )
{
cChessboard[i][j]='0';
}
}
cChessboard[x][y]='0';
}
/*八皇后算法,,x,y为当前皇后坐标,cEmpress为皇后*/
void EightEmpress(int x,int y,char cEmpress)
{
if ( x<8 && y<8 )
{
if ( cChessboard[x][y]=='0' )
{
//如果该位置没有其他皇后可以攻击到,就放到该位置并计算其攻击范围
cChessboard[x][y]=cEmpress;
gongjiFW(x,y,cEmpress);
//如果8个皇后都放完,就增加一次摆法,并输出
if ( cEmpress=='H' )
{
int i;
int j;
n++;
for ( i=0; i<8; i++ )
{
for ( j=0; j<8; j++)
{
printf("%c,",cChessboard[i][j]);
}
printf("/n");
}
printf("/n");
}
//放下一个皇后
cEmpress++;
EightEmpress(x+1,0,cEmpress);
//回退并取消该皇后的攻击范围
cEmpress--;
quxiaoFW(x,y,cEmpress);
}
//皇后往右一格放
EightEmpress(x,y+1,cEmpress);
}
}
void main()
{
int i;
int j;
for ( i=0; i<8; i++ )
{
for ( j=0; j<8; j++ )
{
cChessboard[i][j]='0';
}
}
EightEmpress(0, 0, 'A');
printf("%d/n",n);
}
05-24
1万+

被折叠的 条评论
为什么被折叠?



