/************************************** --修改日期: 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); }
八皇后问题
最新推荐文章于 2021-10-30 16:05:18 发布