八皇后问题

八皇后问题

#include<stdio.h> 
#include<stdlib.h>  

int Count = 1;  

int IsLegal(int ChessBoard[][8],int Loop); 
void Trial(int i, int ChessBoard[][8]);

int main(void) { 	
	int ChessBoard[8][8] = {
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0},
 		{0,0,0,0,0,0,0,0} 	
 	};
	Trial(0, ChessBoard);
  		
	return 0; 
}

int IsLegal(int ChessBoard[][8],int Loop) 
{
 	int Col = 0;
 	int Line = 0;
 	int m = 0;
 	int n = 0;
 	for (Col = 0; Col <= Loop; Col++) {//依次检测每个皇后
 		for (int i = 0; i < 8; i++) {
 			if (ChessBoard[Col][i] == 1) {
 				Line = i;
 				break;
 			} 		
		} 		
		for (int i = 0; i < 8; i++) {
 			if (i != Line) {
 				if(ChessBoard[Col][i] == 1)
				 	return 0; 
 			}
 		}
 		for (int i = 0; i < 8; i++) {
 			if (i != Col) {
				if(ChessBoard[i][Line] == 1)
					return 0;
 			}
 		}
 		m = Col - 1;
 		n = Line - 1;
 		while (m >= 0 && n >= 0) {
 			if(ChessBoard[m--][n--] == 1)
 				return 0;
 		}
 		m = Col + 1;
 		n = Line + 1;
 		while (m <= 7 && n <= 7) {
 			if(ChessBoard[m++][n++] == 1)
 				return 0;
 		}
 		m = Col + 1;
 		n = Line - 1;
 		while (m <= 7 && n >= 0) {
 			if(ChessBoard[m++][n--] == 1)
 				return 0;
			 	 
 		}
 		m = Col - 1;
 		n = Line + 1;
 		while (m >= 0 && n <= 7) {
			if(ChessBoard[m--][n++] == 1)
				return 0; 
			
 		}
 		//找到当前皇后的攻击位置上有其他皇后则返回0 

 	}
 	return 1; //不存在有皇后在其他皇后的攻击范围内,则合理,当前情况可行
}  
void Trial(int i, int ChessBoard[][8]) 
{
 	if (i > 7) {//当已经有8个皇后,则可以输出该情况
 		for (int k = 0; k < 8; k++) {
 			for (int j = 0; j < 8; j++) {
 				printf("%d ", ChessBoard[k][j]);
 			} 
			printf("\n");
 		}
 		printf("##########<%d>#############\n",Count++);
 	} 	
	else {
 		for (int j = 0; j < 8; j++) {//查看在当前行每个位置放皇后的情况
 			ChessBoard[i][j] = 1;
 			if (IsLegal(ChessBoard,i))//若在当前位置放上皇后,依旧合理
 				Trial(i + 1, ChessBoard);//看看在下一行再加一个皇后的情况
 			ChessBoard[i][j] = 0;//将皇后拿走,回到循环起始看下一个位置的情况!
 		}
 	}
 }


运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值