题目描述

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

上面的布局可以用序列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大小的。

输出格式

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

输入输出样例

输入 #1复制

6
输出 #1复制

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

说明/提示

题目翻译来自NOCOW。

USACO Training Section 1.5


题解

此题是标准的DFS题目。有一个非常朴素的想法,就是用一个二维数组vis表示棋子放置后受到影响的格子。每放置一个棋子侯将所有受到影响的格子+1,DFS结束后将这些格子-1。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h> using namespace std; const int MAXN = ;
int n, s = , cnt = , cnt2 = ;
int vis[MAXN][MAXN], ans[MAXN][MAXN], map[MAXN][MAXN]; void dfs( int x )
{
if ( x > n )
{
s++;
cnt++;
if ( cnt <= )
{
cnt2 = ;
for ( int i = ; i <= n; i++ )
{
for ( int j = ; j <= n; j++ )
{
if ( map[i][j] == )
{
cnt2++;
ans[cnt][cnt2] = j;
}
}
}
}
return;
}
for ( int i = ; i <= n; i++ )
{
if ( vis[x][i] == )
{
// cout << x << ", " << i << endl;
vis[x][i]++;
map[x][i] = ;
for ( int j = ; j <= n; j++ )
{
vis[x][j]++;
if ( j >= x )
{
vis[j][i]++;
}
if ( x + j <= n && i >= j )
{
vis[x + j][i - j]++;
}
if ( x + j <= n && i + j <= n )
{
vis[x + j][i + j]++;
}
}
dfs( x + );
vis[x][i]--;
map[x][i] = ;
for ( int j = ; j <= n; j++ )
{
vis[x][j]--;
if ( j >= x )
{
vis[j][i]--;
}
if ( x + j <= n && i >= j )
{
vis[x + j][i - j]--;
}
if ( x + j <= n && i + j <= n )
{
vis[x + j][i + j]--;
}
}
}
}
} int main()
{
cin >> n;
dfs( );
for ( int i = ; i <= ; i++ )
{
for ( int j = ; j <= n; j++ )
{
cout << ans[i][j] << " ";
}
cout << endl;
}
cout << cnt << endl; return();
}

本来以为这个代码会TLE,但是很幸运的是代码AC了。最后一个测试点用了800+ms。

这个代码是可以被优化的,可以用3个一维数组代替二维数组。一个一维数组代表所有列,只要有一个棋子布在某列,则这个数组列对应的元素就置1。类似的2个一维数组代表和2条对角线平行的线。

洛谷 P1219 八皇后题解的更多相关文章

  1. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  2. 洛谷 P1219八皇后

    把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...

  3. 洛谷 p1219 八皇后

    刚参加完蓝桥杯 弱鸡错了好几道..回头一看确实不难 写起来还是挺慢的 于是开始了刷题的道路 蓝桥杯又名搜索杯 暴力杯...于是先从dfs刷起 八皇后是很经典的dfs问题 洛谷的这道题是这样的 上面的布 ...

  4. 【洛谷P1219 八皇后】

    参考思路见白书(一本通) 题目链接 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上 ...

  5. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  6. 洛谷P1219 八皇后

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  7. 洛谷 - P1219 - 八皇后 - dfs

    https://www.luogu.org/problemnew/show/P1219 一开始朴素检查对角线就TLE了,给对角线编码之后压缩了13倍时间? 找了很久的bug居然是&&写 ...

  8. 洛谷P1219 八皇后 我。。。。。。

    代码1    (学弟版) #include<bits/stdc++.h>using namespace std;int l[15];bool s[15];                  ...

  9. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

随机推荐

  1. Spring MVC -- Spring Tool Suite和Maven(安装Tomcat、JDK)

    Spring提供了自己的集成开发环境(IDE),称为Spring Tool Suite(STS),它可能是构建Spring应用程序的最佳IDE了.STS捆绑了Maven作为其默认依赖管理工具,因此不需 ...

  2. php异常处理小总结

    2019年8月23日10:56:31 php很多开发不习惯使用异常处理,因为web开发,重在于快速开发,易用性,高性能,不强调程序健壮性 php的异常使用其实不是太完善,易用性也差点,当然这个对比其他 ...

  3. linux 安装 btrace

    1.下载btrace https://github.com/btraceio/btrace/releases/download/v1.3.8.3-1/btrace-bin-1.3.8.3.tgz2.上 ...

  4. linux内存管理swap分区

    一.什么是linux的内存机制? 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物 ...

  5. layui switch 确定之后才变更状态

    let x = data.elem.checked; data.elem.checked = !x; form.render(); 完整代码 form.on('switch(is_enable)', ...

  6. CSP(noip)中的简单对拍写法

    以a+b为例 这是随机数据 #include<iostream> #include<cstdio> #include<ctime> using namespace ...

  7. Linux基础(05)socket编程

    Linux的核心思想之一 "一切皆文件" 内容 , socket在Linux内核的实现的代码及TCP和UDP的实现 网络编程常用头文件: https://blog.csdn.net ...

  8. Oracle数据库Schema的简介

    百度文库中 Schema 的解释: 数据库中的Schema,为数据库对象的集合,一个用户一般对应一个schema. 官方定义如下: A schema is a collection of databa ...

  9. 记一次node爬虫经历,手把手教你爬虫

    今天业务突然来了个爬虫业务,爬出来的数据以Excel的形式导出,下班前一个小时开始做,加班一个小时就做好了.因为太久没做爬虫了!做这个需求都是很兴奋! 需求说明 访问网站 (循环)获取页面指定数据源 ...

  10. 打印从1到n位数的最大值

    题目: 输入数字n,按顺序打印从1到最大的n位十进制数,如输入3,则打印从1.2.3一直到最大的3位数999 参考大数运算的方法.考虑到位数会很大,所以采用字符串的形式解决.对输入的n,创建一个长度为 ...