8皇后问题
八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
正确答案92种。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int num = 0; 5 int q[9];//第i个皇后所在列 6 int c[9];//标记当前列是否安全 7 int l[17];//标记主对角线是否安全 8 int r[17];//标记斜对角线是否安全 9 void queue(int i) 10 { 11 int j,k; 12 for(j=1; j<=8; j++)//对第i行每一列运算 13 { 14 if(c[j]&&l[i-j+9]&&r[i+j])//如果安全,否则遍历完8个后就回到上一次调用 15 { 16 q[i] = j;//记录第i行皇后在哪一列 17 c[j] = 0; 18 l[i-j+9] = 0; 19 r[i+j] = 0;//不安全 20 if(i<8)//如果不是最后一行 21 queue(i+1);//递归 22 else//最后一行,开始回溯 23 { 24 num++; 25 printf("方案%2d:",num); 26 for(k=1; k<=8; k++) 27 printf("%d ",q[k]); 28 printf("\n"); 29 } 30 c[j] = 1; 31 l[i-j+9] = 1; 32 r[i+j] = 1;//回溯完毕,都解除为安全 33 } 34 } 35 } 36 int main() 37 { 38 memset(c,1,sizeof(c)); 39 memset(l,1,sizeof(l)); 40 memset(r,1,sizeof(r)); 41 queue(1); 42 return 0; 43 }

浙公网安备 33010602011771号