HDU 1253

来源:互联网 发布:setdefault c语言 编辑:程序博客网 时间:2024/05/21 05:56


#include<iostream>
#include<algorithm>
#include<string.h>
int n,sum,s;
bool b[11][11];
using namespace std;
int main()
{
    void dfs(int,int,int);
    while (cin >> n)
    {
        sum = 0; s = 0;
        memset(b, false, sizeof(b));
        dfs(1,1,0);
        cout << s << endl;
    }
    return 0;
}
void dfs(int q,int w,int sum)
{
    if (sum == n)
    {
        s++; return;
    }
    bool can(int, int);
    for (int i = q; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (b[i][j]==false&&can(i, j))
            {
                sum++;
                b[i][j] = true;
                dfs(i+1,j,sum);
                sum--;
                b[i][j] = false;
            }
            if (j == n) return;


        }
    }
}
bool can(int x, int y)
{
    bool a = 0;
    for (int i = 1; ; i++)
    {
        if (x + i <= n)
        {
            if (b[x + i][y] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (x - i >= 1)
        {
            if (b[x - i][y] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (y + i <= n)
        {
            if (b[x][y + i] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (y - i >= 1)
        {
            if (b[x][y - i] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (x + i <= n&&y + i <= n)
        {
            if (b[x + i][y + i] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (x + i <= n&&y - i >= 1)
        {
            if (b[x + i][y - i] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (x - i >= 1 && y + i <= n)
        {
            if (b[x - i][y + i] == true) return false;
        }
        else break;
    }
    for (int i = 1; ; i++)
    {
        if (x - i >= 1 && y - i >= 1)
        {
            if (b[x - i][y - i] == true) return false;
        }
        else break;
    }
    return true;
}

n*n的房间 n个皇后 按题意,每行都要放一个,且只能放一个,所以只要放好一个,直接递归下一行便可,每当到一行的最后一个便可return;

没想到这样之后时间依然超时,无奈之下只好用以上程序打表。ac代码如下

#include<iostream>
using namespace std;
int main()
{
int a[12];
a[1] = 1; a[2] = 0; a[3] = 0; a[4] = 2; a[5] = 10;
a[6] = 4; a[7] = 40; a[8] = 92; a[9] = 352;
a[10] = 724; a[11] = 2680;
int n;
while (cin >> n&&n)
{
cout << a[n] << endl;
}
return 0;
}

原创粉丝点击