用C语言解答八皇后问题

       八皇后问题的描述:

               八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。     

#include<stdio.h>

void show(int arr[8][8])
 {
	 int i;
	 int j;
	 for(i=0;i<8;i++)
	 {
		 for(j=0;j<8;j++)
		 {
			 printf("%-4d",arr[i][j]);
		 }
		 printf("\n");
	 }
 }
void Queue(int arr[8][8])
 {
	 int count=0;
	 for(int n1=0;n1<8;n1++)
	 {
		 arr[0][n1]=1;
		 for(int n2=0;n2<8;n2++)
		 {
			 if(n1!=n2 && n1-1!=n2 && n1+1!=n2)
			 {
				 arr[1][n2]=1;
				 for(int n3=0;n3<8;n3++)
				 {
					 if(n1!=n3 && n2!=n3 &&
					    n3 !=n1+2 && n3 !=n2+1 &&
						 n3 !=n1-2 && n3 !=n2-1)
					 {
						 arr[2][n3]=1;
						 for(int n4=0;n4<8;n4++)
						 {
							 if( n1 != n4 && n2!=n4 &&
								 n3 != n4 && n4 !=n1+3 &&
								 n4 != n2+2 && n4 !=n1-3 &&
								 n4 != n2-2 && n4!=n3-1 &&
								 n4 != n3+1)
							 {
								 arr[3][n4]=1;
								 for(int n5=0;n5<8;n5++)
								 {
									 if(n1!=n5 && n2!=n5 &&
										 n3!=n5 && n4!=n5 &&
										 n1+4!=n5 && n2+3!=n5 &&
										 n3+2!=n5 && n4+1!=n5 &&
										 n1-4!=n5 && n2-3!=n5 &&
										 n3-2!=n5 && n4-1!=n5 )
									 {
										 arr[4][n5]=1;
										 for(int n6=0;n6<8;n6++)
										 {
											 if(n1!=n6 && n2!=n6 &&
										         n3!=n6 && n4!=n6 &&
												 n5!=n6 && n1+5!=n6 &&
												 n2+4!=n6 &&n3+3!=n6 &&
												 n4+2!=n6 &&n5+1!=n6 &&
												 n1-5!=n6 &&n2-4!=n6 &&
												 n3-3!=n6 &&n4-2!=n6 &&
												 n5-1!=n6 )
											 {
												 arr[5][n6]=1;
												 for(int n7=0;n7<8;n7++)
												 {
													 if(n7!=n1 && n7!=n2 &&
														 n7!=n3 && n7!= n4 &&
														 n7!= n5 && n7!= n6 &&
														 n7!=n1+6 && n7!=n2+5 &&
														 n7!=n3+4 && n7!= n4+3 &&
														 n7!= n5+2 && n7!= n6+1 &&
														 n7!=n1-6 && n7!=n2-5 &&
														 n7!=n3-4 && n7!= n4-3 &&
														 n7!= n5-2 && n7!= n6-1 )
													 {
														 arr[6][n7]=1;
														 for(int n8=0;n8<8;n8++)
														 {
															 if( n8 !=n1  && n8 !=n2 &&
																 n8 !=n3 && n8 !=n4 && n8 !=n5
																 && n8 !=n6 && n8 !=n7 && n8 != 7+n1
																 && n8 != 6+n2 && n8 != 5+n3 && n8 != 4+n4
																 && n8 != 3+n5 && n8 != 2+n6 && n8 != 1+n7
																 && n8 != n1-7 && n8 != n2-6 && n8 != n3-5
																 && n8 != n4-4 && n8 != n5-3 && n8 != n6-2
																 && n8 != n7-1)
															 {
																 arr[7][n8]=1;
																 count++;
																 show(arr);
																 printf("\n");
															 }
															arr[7][n8]=0;
														 }
													 }
													 arr[6][n7]=0;
												 }
											 }
											 arr[5][n6]=0;
										 }
									 }
									 arr[4][n5]=0;
								 }
							 }
							 arr[3][n4]=0;
						 }
					 }
					 arr[2][n3]=0;
				 }
				  
			 }
			 arr[1][n2]=0;
		 }
		 arr[0][n1]=0;
	 }
	  printf("总共有的可能性:%d\n",count);
 }

 
int main()
{
	int arr[8][8]={0};
	Queue(arr);
	return 0;
}

      用C语言来写八皇后显得比较复杂,但是对于刚开始学习C语言的同学来说,仅仅采用8层for循环就可以把每次的结果一一列出来,写起来虽然麻烦,但是很容易理解。总共有92种可能性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值