首页 > 其他分享 >类似于八皇后的国际跳棋问题

类似于八皇后的国际跳棋问题

时间:2023-04-21 23:24:36浏览次数:33  
标签:int 类似 跳棋 一个 maxn 皇后 棋盘

题目描述

检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

img

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。

//以下的话来自usaco官方

特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了!

输入格式

一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

分析

在国际象棋中,皇后可以横向、纵向、斜向(与数轴成45角)攻击

所以我们可以这样想:可以将每个皇后放在不同的行和列,这样在棋盘第一行随便放一个皇后,之后使用dfs深度优先搜索,每次访问标记一个位置,直到每行都有一个皇后,之后取消之前对位置的标记,再次寻找答案。

而其中取消对位置的标记的过程我们可以称为回溯。

下面上代码

#include<iostream>
#include<cstring> using namespace std;
#define maxn 110 int a[maxn];
int n;
bool vis[3][maxn];
int total = 0;
void print()
{
    if (total < 3)
    {
        for (int i = 0; i < n; i++)
            cout << a[i] + 1 << " ";
        cout << endl;
    }
    total++;
}
inline void dfs(int x)
{
    if (x == n)
    {
        print();
        return;
    }
    for (int i = 0; i < n; i++)
    {
        if (!vis[0][i] && !vis[1][i + x] && !vis[2][x - i + n])
        {
            a[x] = i;
            vis[0][i] = vis[1][i + x] = vis[2][x - i + n] = true;
            dfs(x + 1);
            vis[0][i] = vis[1][i + x] = vis[2][x - i + n] = false;
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    memset(vis, false, sizeof(vis));
    cin >> n;
    dfs(0);
    cout << total;
}

标签:int,类似,跳棋,一个,maxn,皇后,棋盘
From: https://www.cnblogs.com/fun-debug/p/17342153.html

相关文章

  • 一些有意思的金融模型---施工行业没油水可榨了--施工企业生产得最终目的类似银行
    起因所在行业:建筑工程施工钱的本质是等价交换,或者说经济的本质,在于印钱和流通,当钱被卡住多了,拿钱的就成了大爷。机制需要得人所以我们不妨设立一个这样机制。这个机制需要几个人。施工企业银行施工企业的合作老板类似房地产金融模型机制这个机制运转集中在于钱。而且......
  • Squirrel 类似clickonce 的工具
    微软的clickonce是一个比较强大的软件更新以及分发模式,Squirrel是一个开源的类似的工具,提供的功能相比clickonce多了不少,对于windows桌面应用的分发是一个值得选择的工具参考资料https://github.com/Squirrel/Squirrel.Windowshttps://learn.microsoft.com/en-us/visualstud......
  • uni-app实现类似confirm提示框的效果
    uni.showModal({title:'提示',content:'这是一个模态弹窗',success:function(res){if(res.confirm){console.log('用户点击确定');}elseif(res.cancel){console.log('用户点击取消'......
  • [OpenCV] 漫水填充floodFill (类似于photoshop的智能填充)
    两个函数重载:CV_EXPORTSintfloodFill(InputOutputArrayimage,PointseedPoint,ScalarnewVal,CV_OUTRect*rect=0,ScalarloDiff=Scalar(),ScalarupDiff=Scalar(),intflags......
  • 网页滚动体验,IScroll滚动插件,你安装了类似的滚动页面插件吗
    IScroll是一款基于JavaScript的插件,用于在网页中实现平滑滚动效果。这个插件可以帮助用户创建回到页面顶部和底部的按钮、生成页面导航快照,以及设置滚动时间等功能,从而提升网页的用户体验。IScroll的特点在于,它能够平滑地滚动网页内容,而不会像传统的滚动条那样跳跃。此外,该插件可以......
  • 网页滚动体验,IScroll滚动插件,你安装了类似的滚动页面插件吗
    IScroll是一款基于JavaScript的插件,用于在网页中实现平滑滚动效果。这个插件可以帮助用户创建回到页面顶部和底部的按钮、生成页面导航快照,以及设置滚动时间等功能,从而提升网页的用户体验。IScroll的特点在于,它能够平滑地滚动网页内容,而不会像传统的滚动条那样跳跃。此外,该插......
  • NUIST Levoj P1220 皇后摆放问题
    #include<iostream>#include<algorithm>#include<vector>#include<cstring>usingnamespacestd;intchess[9][9];intarr[9][9];intcnt=0,sum=0;boolcheck(introw,intcol){ for(inti=1;i<9;i++)if(chess[i][col])returnfalse; for(inti=......
  • 基于mpc的日前日内微网共享储能优化调度 日前优化部分&mdash;&mdash;该程序首先根据《
    基于mpc的日前日内微网共享储能优化调度日前优化部分——该程序首先根据《电力系统云储能研究框架与基础模型》上面类似方法,首先根据每个居民的实际需要得到响应储能充放电功率,然后优化得到整体的储能充放电功率情况。日内滚动mpc跟踪部分——采用《基于MPC的微电网并网优化调度......
  • 纯前端仿GPT流式打字效果的js库,类似通义千问或者其他AI界面的打字效果
    因为GPT以及国内各大模型的发布,很多官网都设计的是,仿造流式打字效果,下面这个js库就能轻松实现。typed.js  具体实现代码参考下面:<spanid="subTitle"></span><scriptsrc="https://unpkg.com/[email protected]/dist/typed.umd.js"></script><script>vartyped=......
  • 有没有类似花生壳一样的内网穿透免费开源项目
    是的,有很多内网穿透的开源项目可以选择,以下是其中几个:ngrok:ngrok是一个非常流行的内网穿透工具,可以将本地服务器映射到公共互联网上,并提供一个唯一的URL。frp:frp是另一个流行的免费开源的内网穿透工具,支持TCP、UDP、HTTP、HTTPS等协议,并且提供了类似花生壳的服务功能。NA......