87分求助
查看原帖
87分求助
1304731
封禁用户楼主2024/8/27 18:48

#10超时,其它正确。
代码:

#include<bits/stdc++.h>
using namespace std;
int queens[13][13],place[13],attack[13][13],k,c;
int d[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,-1}};
void check(bool x,bool y,int attx,int atty,int n)
{
    if(x && y)
    {
        if(attack[attx][atty]==0) attack[attx][atty]=n;
    }
}
void back(int n)
{
    for(int i=0;i<k;i++)
    {
        for(int j=0;j<k;j++)
        {
            if(attack[i][j]==n) attack[i][j]=0;
        }
    }
}
void queen(int n)
{
    if(n==k+1)
    {
        c++;
        if(c<=3)
        {
            for(int i=0;i<k;i++) cout<<place[i]+1<<' ';
            cout<<'\n';
        }
        return;
    }
    for(int i=0;i<k;i++)
    {
        if(attack[n-1][i]==0)
        {
            int attx=n-1,atty=i;
            for(int j=0;j<k;j++)
            {
                check(attx-j>=0,atty-j>=0,attx-j,atty-j,n);
                check(attx-j>=0,1,attx-j,atty,n);
                check(attx-j>=0,atty+j<k,attx-j,atty+j,n);
                check(1,atty-j>=0,attx,atty-j,n);
                check(1,1,attx,atty,n);
                check(1,atty+j<k,attx,atty+j,n);
                check(attx+j<k,atty-j>=0,attx+j,atty-j,n);
                check(attx+j<k,1,attx+j,atty,n);
                check(attx+j<k,atty+j<k,attx+j,atty+j,n);
            }
            queens[attx][atty]=1;
            place[n-1]=i;
            queen(n+1);
            back(n);
        }
    }
}
int main()
{
    cin>>k;
    queen(1);
    cout<<c;
    return 0;
}
2024/8/27 18:48
加载中...