1 条题解

  • -1
    @ 2025-12-5 9:21:56

    在平时里做题时不要学习这种行为!!

    考场上不知正解,只知乱搞。

    写完 DFS 后,发现跑出前 1010 组解是容易的。

    关于如何处理对角线,列的可放性,属于基础内容。这里不再赘述。

    但跑出所有解是困难的,在 n=15n=15 是需要 17 s17 \ \text{s}

    但这个时间也不是太长,考虑打表。

    跑出前 kk 组解后,直接输出方案数并退出程序。

    这一题就做完了。

    #include<bits/stdc++.h>
    using namespace std;
    int n,k;
    int c[20];
    int cnt;
    int ans[16]={/*此处略去,表你自己打去*/};
    void dfs(int lin,int row,int sta,int stu)
    {
       if(lin==n+1)
       {
       	++cnt;
       	if(cnt<=k)
       	{
       		for(int i=1;i<=n;i++)
       			cout<<c[i]<<' ';
       		cout<<'\n';
       	}
       	else
       	{
       		cout<<ans[n]<<'\n';
       		exit(0);
       	}
       }
       else
       {
       	for(int i=1;i<=n;i++)
       	{
       		if((row&(1<<(i-1)))==0&&(sta&(1<<(i+lin-1)))==0&&(stu&(1<<(i-lin+n)))==0)
       		{
       			c[lin]=i;
       			dfs(lin+1,row|(1<<(i-1)),sta|(1<<(i+lin-1)),stu|(1<<(i-lin+n)));
       			c[lin]=0;
       		}
       	}
       }
    }
    signed main()
    {
       cin>>n>>k;
       dfs(1,0,0,0);
       return 0;	
    } 
    

    在平时里做题时不要学习这种行为!!

    • 1

    信息

    ID
    603
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    6
    已通过
    3
    上传者