求助,最后一个点TLE了

P1219 [USACO1.5] 八皇后 Checker Challenge

jd123 @ 2023-01-24 14:48:48


int n,cnt;
int a[14][15];
int book[15][15];
int ans[15];//放置列的解
//看该点是否符合
bool pp(int hang)
{
    int x=hang,y=ans[hang];
    for(int i=1;i<hang;i++)
    {
        int x1=i,y1=ans[i];
        if((x1-x==y1-y)||(x1-x==y-y1))
        {
            return 0;
        }
        if(x1==x||y==y1)
        {
            return 0;
        }
    }
    return 1;
}
void dfs(int hang)
{
    if(hang==n+1)
    {
        cnt++;
        if(cnt<=3)
        {
            for(int i=1;i<=n;i++)
            {
                printf("%d ",ans[i]);   
            }   
            printf("\n");
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(book[hang][i]==1)
        {
            continue;
        }else book[hang][i]=1;
        ans[hang]=i;
        //先检查这一次放的点是不是符合的
        if(!pp(hang))
        {
            book[hang][i]=0;
            continue;
        }
        dfs(hang+1);
        book[hang][i]=0;
    }
}
int main()
{
    scanf("%d",&n);
    dfs(1);
    printf("%d",cnt);
    return 0;
}

by Adchory @ 2023-01-24 14:58:34

@jd123 其实你可以开 O2 的,其次,你的判断操作时间复杂度较高


by jd123 @ 2023-01-24 15:02:45

@Reimu_Hakurei 哇,开了O2优化就过了,一直不知道那个O2有什么用


by Wtmwy @ 2023-02-19 23:20:40

@jd123 有的测试点超时得不多,一优化就过了


|