尝试用BFS解决这个问题,最后超时了,有大佬可以教教优化的方法吗?

P1219 [USACO1.5] 八皇后 Checker Challenge

cczzyyyy @ 2023-03-16 19:06:04

#include<iostream>
#include<queue>
using namespace std;

int tmp[100];

int n;
int tmp1;
int tmp2;

int otp = 3;
int cnt = 0;

struct sj
{
    int rw;
    int ret[100];
};

queue<sj> que;

void canbeput(int result[], int row)//目前要排第row行的棋子 
{
    for (int i = 1; i <= n; ++i)
    {
        tmp[i] = 1;
    }

    for (int i = 1; i < row; ++i)
    {
        tmp[result[i]] = 0;
        tmp1 = result[i];
        tmp2 = result[i];
        for (int j = i; j < row; ++j)
        {
            tmp1++;
            tmp2--;
        }
        if (tmp1 <= n) tmp[tmp1] = 0;
        if (tmp2 >= 1) tmp[tmp2] = 0;
    }
    //tmp中1的位置即为可以放棋子的位置 
}

void bfs()
{
    for (int i = 1; i <= n; ++i)
    {
        sj tmp;
        tmp.ret[1] = i;
        tmp.rw = 1;
        que.push(tmp);
    }
    while (!que.empty())
    {
        sj noww;
        noww = que.front();
        que.pop();
        if (noww.rw == n)
        {
            otp--;
            cnt++;
            if (otp >= 0)
            {
                for (int i = 1; i <= n; ++i)
                {
                    cout << noww.ret[i] << " ";
                }
                cout << endl;
            }
            continue;
        }
        canbeput(noww.ret, noww.rw+1);
        for (int i = 1; i <= n; ++i)
        {
            if (tmp[i] == 1)
            {
                sj neww;
                neww = noww;
                neww.rw++;
                neww.ret[neww.rw] = i;
                que.push(neww);
            }
        }
    }
    cout << cnt << endl;
}

int main()
{
    cin >> n;
    bfs();
    return 0;
}

by _Adolf_Hitler_ @ 2023-03-16 19:41:14

首先,先康康介个好好瞅瞅,康康犯了啥忌讳

BFS=BDFS=百度,违反Part2第二条中第三小条。

其次,这道题还是DFS清晰。

#include <bits/stdc++.h>
using namespace std;
int heng[20],jia[50],jian[50],put[20],x,ans;
int n,flag=1;
void print()
{
    flag++;
    for (int i=1; i<=n; i++)
        cout<<put[i]<<" ";
    cout<<endl;
    return;
}
void dfs(int x)
{
    for (int i=1; i<=n; i++)
        if (heng[i]==0 && jia[i+x]==0 && jian[i-x+10]==0)
        {
            put[x]=i;
            heng[i]=1;
            jia[i+x]=1;
            jian[i-x+10]=1;
            if (x==n)
            {
                ans++;
                if(flag<=3)
                    print();
            }
            else
                dfs(x+1);
            heng[i]=0;
            jia[i+x]=0;
            jian[i-x+10]=0;
        }
    return;
}
int main()
{
    cin>>n;
    dfs(1);
    cout<<ans;
    return 0;
}

假如说一定要用#%&^$&,那么我不会,但我还是能教你,那么请你康康


by fengziyi @ 2023-03-16 20:06:11

为什么会有人认为 BFS = BDFS 啊


by cczzyyyy @ 2023-03-16 20:32:17

@fengziyi BDFS是什么意思,是让我去百度吗?


by fengziyi @ 2023-03-16 21:08:05

@cczzyyyy 这道题的做法是 DFS,使用 BFS 会超时。
我的楼上可能表述不清,或是理解错了社区规定,lz 的提问做法没有任何问题。
我的建议除非学习新算法,否则少用 baidu。


|