首页 > 其他分享 >P1219 [USACO1.5]八皇后 Checker Challenge

P1219 [USACO1.5]八皇后 Checker Challenge

时间:2022-11-10 17:59:35浏览次数:42  
标签:记录 int 斜线 Challenge Checker bool 皇后 P1219 105

题目描述: 把 n 个皇后无伤放进n * n的棋盘上。

输出要求:按字典序输出前三个放置方案中第1~n行的皇后的列数构成的序列。

 

思路:

  核心难点在于如何记录前一个状态用于回溯。

  如果我们采用一个n * n的矩阵记录第 i 行第 j 列的格子是否被场上皇后控制,我们必须要记录有几个皇后能控制这个格子(二维int数组),否则回溯的时候会出问题,因为其他皇后可能仍然控制着这个格子。这就造成了巨大的内存开销。

  我们敏锐地注意到,其实并不需要记录每个格子是否被控制,因为每一行每一列每一条斜线都只能存在一个皇后。换言之,我们只需要记录每一行每一列每一条斜线是否被控制就可以了。第 i 行有没有被控制不需要考虑,因为我们就是基于行数进行回溯的。其他三种情况可以采用下列方法记录:

    ① 第 j 列:是很好记录的,使用一维bool数组c[ j ]。

    ② 斜率为正的斜线:y - x = k(k = -(n - 1),……,1,2,……,n - 1),一共是2n - 1条。我们敏锐地注意到,截距 k 唯一标识了一条斜线。那么,我们可以用一维bool数组x2[k + n],即x2[y - x + n]来记录。(加 n是为了让数组下标为正)

    ③斜率为负的斜线:y + x = k(k = -(n - 1),……,1,2,……,n - 1),一共是2n - 1条。同理②,我们可以用一维bool数组x1[ k ],即x1[y + x]来记录。

 

#include<iostream>
#include<cstring>
using namespace std;
int n;
int temp[105], tot, l, con;
bool c[105], x1[105], x2[105];



void Find(int st)
{
    if(st > n)
    {
        tot++;
        if(con<3)
        {
            con++;
            for(int i = 1; i <= n; i++)
            {
                if(i > 1) cout<<" ";
                cout<<temp[i];
            }
            cout<<endl;
        }
        return ;
    }
    for(int i = 1; i <= n; i++)
        if(!c[i] && !x1[st + i] && !x2[st - i + n])
        {
            c[i] = 1;
            x1[st + i] = 1;
            x2[st - i + n] = 1;
            temp[++l] = i;
            Find(st + 1);
            --l;
            c[i] = 0;
            x1[st + i] = 0;
            x2[st - i + n] = 0;
        }
}
int main()
{
    cin>>n;
    Find(1);
    cout<<tot;
    return 0;
}
回溯

 

标签:记录,int,斜线,Challenge,Checker,bool,皇后,P1219,105
From: https://www.cnblogs.com/nightfury/p/16877880.html

相关文章

  • POJ 1035 Spell checker
    DescriptionYou,asamemberofadevelopmentteamforanewspellcheckingprogram,aretowriteamodulethatwillcheckthecorrectnessofgivenword......
  • Platform Challenges & Explorations for Deep Learning Medical Image Analysis
    PlatformChallenges&ExplorationsforDeepLearningMedicalImageAnalysis姚伟峰http://www.cnblogs.com/Matrix_Yao/2017年旧文PlatformChallenges&......
  • 【THM】Net Sec Challenge-练习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/netsecchallenge使用此挑战来测试你的技能掌握程度,此挑战中的所有问题都可以仅使用nmap、telnet和hydra来解......
  • Checkerboard Pattern Shader
    写在前面:本文章为个人学习笔记,方便以后自己复习,也希望能帮助到他人。由于本人水平有限难免出现错误,还请评论区指出,多多指教。部分图元和素材来源于网络,如有侵权请联系本......
  • Let’s Encrypt Challenge and acme.sh Issue Mode
    Basicdnscname:将域名指向另外一个域名;txt:存储一个512长度内的文本,通常作SPF记录(SenderPolicyFramework反垃圾邮件);ns:将子域名指定其他的DNS服务器解析;dig​​linuxd......
  • HNNCTF web-Challenge__rce(自增命令执行+限制长度)
    <?phperror_reporting(0);if(isset($_GET['hint'])){highlight_file(__FILE__);}if(isset($_POST['rce'])){$rce=$_POST['rce'];if(strlen($rce......
  • BZOJ 2295: 【POJ Challenge】我爱你啊
    题目链接:​​传送门​​看到题目就进来了#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<algorithm>#include<cl......
  • La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017
    AAmbiguousDates贪心,从小到大取日期#include<bits/stdc++.h>usingnamespacestd;#define#define#define#define#define#define#define#define#define#define#define#def......
  • Pure JS Coding Challenge01 — 双色球彩票
    PureJSCodingChallenge01—双色球彩票功能说明:双色球由33个红球和16个蓝球组成,一记双色球包括6个不重复的红球和1个蓝球。请阅读给定的页面和代码,完成randomFn函数......
  • Pure JS Coding Challenge01 — 双色球彩票
    PureJSCodingChallenge01—双色球彩票功能说明:双色球由33个红球和16个蓝球组成,一记双色球包括6个不重复的红球和1个蓝球。请阅读给定的页面和代码,完成randomFn函数......