微信扫一扫

028-83195727 , 15928970361
business@forhy.com

图的搜索-八皇后

c语言,八皇后,搜索,acm,算法2016-06-16

题目:

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!

思路

1、使用搜索
2、数据结构采用一维数组,A[i]表示第i列,A[i]中存的数值表示第i列的第几个元素,即“行”。
3、判断是否为同一行:A[cur]==A[j]
判断是否为同一对角线:
A[cur]==A[j]+cur-j
A[cur]==A[j]-(cur-j)

代码

#include<stdio.h>

int sum=0;//统计解的个数
int A[8];//A[i]表示第i列,A[i]中存的数值表示第i列的第几个元素
int n=8;

void Find(int cur);

int main()
{
    Find(0);
    printf("%d\n",sum);
}

void Find(int cur)
{
    if(cur==n)//递归边界
        sum++;
    else
        for(int i=0; i<n; i++)
        {
            int ok=1;
            A[cur]=i;
            for(int j=0; j<cur; j++)
                //判断是否是同一列,是否在同一斜线上
                //判断是否为同一行:A[cur]==A[j]
                //判断是否为同一对角线:A[cur]==A[j]+cur-j与A[cur]==A[j]-(cur-j)
                if(A[cur]==A[j]||A[cur]==A[j]+cur-j||A[cur]==A[j]-(cur-j))
                {
                    ok=0;
                    break;
                }
            if(ok)
                Find(cur+1);
        }
}