八皇后问题(回溯)

来源:互联网 发布:吉林大学网络教育中心 编辑:程序博客网 时间:2024/05/16 13:58

[问题描述]

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

[解题思路]

      从第1行第1个开始,遍历8*8格,当发现当前点在同一行、同一列或同一斜线上有相同的点就不取该点,遍历到第八行,摆法就加1,然后就回溯。

[代码实现]

#include<stdio.h>int ans[8] = {0}; /*存放棋子在每行的位置*/int Count = 0;void Print(){for(int i = 0; i <8; i ++){for(int j = 0; j < 8; j ++){if(j==ans[i]){printf("# ");continue;}printf("* ");}printf("\n");}printf("_____________________________________\n");}int IsRepeat(int new_i, int new_j){int j;for(int i= 0; i < new_i; i++)  {j = ans[i];if(new_j == j)       /*竖*/ return 0;if((i + j) == (new_i + new_j))  /*右斜线*/return 0;if((i - j) == (new_i - new_j)) /*左斜线*/return 0;}return 1;}void dfs(int i) //i行 {if(i==8){Count ++; Print();return ;}for(int j = 0; j < 8; j++) /*第i行的第几j个*/ {if(IsRepeat(i, j)){ans[i] = j;dfs(i + 1);ans[i] = 0;}}}int main(){dfs(0);printf("total = %d\n", Count);return 0;}


1 0
原创粉丝点击