dfs(二)N皇后问题

标题:N皇后问题

 在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

方法一:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
int ans = 0,x,n;
int a[10]={0},v[10]={1};
void judge()
{
   for(int i = 1;i<=n;i++)
   {
       for(int j=1;j<i;j++)
        {
            if(abs(j-i) == abs(a[j]-a[i]))
            return;
        }
   }
   ans++;
}
void dfs(int x)
{
    if(x>n)
    {
        judge();
        return;
    }
    for(int i=1;i <= n; i++)
    {
        if(v[i])
        {
            v[i] = 0;
            a[x] = 1;
            dfs(x+1);
            v[i] = 1;
        }
    }
}

int main()
{
   scanf("%d",&n);
   dfs(1);
   printf("%d\n",ans);
   return 0;
}

 

这个方法是将所有的数字排列成一行,然后i表示行,a[i](里面的j)表示列。

方法二:

#include <iostream>
#include<cstdio>
using namespace std;
int a[10][10] = {0},v[10] ={0},w[10] = {0};
int ans = 0, n;
void judge()
{
    for(int i = 1; i < n; i++)
    {
        int k = i;
        int j = 1;
        int flag = 0;
        while(k <= n)
        {
            if(a[k][j] == 1)
            {
                flag++;
            }
            k++;
            j++;
        }
        if(flag > 1) return;
    }
    for(int i = 1; i < n; i++)
    {
        int k = i;
        int j = 1;
        int flag = 0;
        while(k <= n)
        {
            if(a[j][k] == 1)
            {
                flag++;
            }
            k++;
            j++;
        }
        if(flag > 1) return;
    }
    for(int i = n; i > 1; i--)
    {
        int k = i;
        int j = 1;
        int flag = 0;
        while(k >= 1)
        {
            if(a[k][j] == 1)
            {
                flag++;
            }
            k--;
            j++;
        }
        if(flag > 1) return;
    }
    for(int i = n; i > 1; i--)
    {
        int k = i;
        int j = n;
        int flag = 0;
        while(k <= n)
        {
            if(a[k][j] == 1)
            {
                flag++;
            }
            k++;
            j--;
        }
        if(flag > 1) return;
    }
    ans++;
}
void dfs(int x)
{
    if(x == (n + 1))
    {
        judge();
        return;
    }
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            if(!a[i][j] && !v[i] && !w[j])
            {
                v[i] = 1;
                w[j] = 1;
                a[i][j] = 1;
                dfs(x + 1);
                a[i][j] = 0;
                v[i] = 0;
                w[j] = 0;
            }
        }
    }

}
int f(int t)
{
    for(int i = 1; i < n; i++)
    {
        t *= i;
    }
    return t;
}
int main()
{
    scanf("%d",&n);
    dfs(1);
    cout << ans / f(n);
    return 0;
}

这个方法不太推荐,比较麻烦。

 

posted on 2017-10-25 19:04  迪迪菜源  阅读(201)  评论(0编辑  收藏  举报

导航