八皇后问题的描述:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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种可能性。