代码编织梦想

[USACO1.5]八皇后 Checker Challenge

题目描述

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

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

行号 1   2   3   4   5   6 1\ 2\ 3\ 4\ 5\ 6 1 2 3 4 5 6

列号 2   4   6   1   3   5 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5

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

输入格式

一行一个正整数 n n n,表示棋盘是 n × n n \times n n×n 大小的。

输出格式

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

样例 #1

样例输入 #1

6

样例输出 #1

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

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 6 ≤ n ≤ 13 6 \le n \le 13 6n13

题目翻译来自NOCOW。

USACO Training Section 1.5

思路分析

这个题其实就是在八皇后的基础上,稍微做了一点变动,下面根据代码分析本题

题意分析

这里先大概分析一下题意,题目意思就是问我们,在一个n * n的棋盘上,把n个皇后放在不同行不同列不同斜线的放法有多少?怎么放,记录怎么放的。

代码分析

dfs深度优先搜索模板(做本题前建议背熟且理解这个模板)

如果这个模板不懂的,建议配合dfs入门题组合数一起理解,后面我会出dfs的分析

#include <iostream>
using namespace std;
void dfs(int u)
{
	if(....)  // 这里填结束条件
	{
			//这里面可以操作我们的答案
			return}
	
	for(int i = 0; i< n; i++) // 这里是枚举每一个子分支
	{
		if()// 子分支满足一定条件
		{
			dfs(u+1); // 在对子分支进行dfs
		}
	}
}

int main()
{
	cin>>n;
	dfs(0);
	return 0;
}

ac demo

#include <iostream>
#include <cstring>
using namespace std;

const int N = 20;
int n, ans;
int g[N][N];
bool col[N], a[N], b[N];//a数组和b数组分别标记对角线

void dfs(int u)
{
    if(u == n)
    {
        if(ans < 3)//根据题目意思,我们只输出前三次的答案
        {
            
        for(int i = 0; i < n; i++)
            {   
            for(int j = 0; j < n; j++)
            if(g[i][j] == 1) cout<<j+1<<" ";
            }
        cout<<endl;
        }
        ans ++;//记录答案的个数
        
        return ;
    }
    
    for(int i = 0; i < n; i++)
    {
        if(!col[i] && !a[u+i] && !b[n - u + i])
        {
            col[i] = a[u+i] = b[n-u+i] = true;
            g[u][i] = 1;
            dfs(u + 1);
            col[i] = a[u+i] = b[n-u+i] = false;
            g[u][i] = 0;
        }
    }
}
int main()
{
    cin>>n;
    
    dfs(0);
    cout<<ans<<endl;
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_61715584/article/details/129674164

P1219 [USACO1.5]八皇后 Checker Challenge(C语言)-爱代码爱编程

P1219 [USACO1.5]八皇后 Checker Challenge 1.思路 1.1对角线的表示 首先根据题目的要求,我们可以用一个数组line[13]表示皇后放置的位置 如line[4]=5 则表示第4行第5列放了一个皇后。然后再分别用ud[13],ld[13]表示上,下对角线 看上对角线的图,不难发现处于上对角线的值都是相等的则可以用

洛谷—P1219 [USACO1.5]八皇后 Checker Challenge题解-爱代码爱编程

题目:P1219 [USACO1.5]八皇后 Checker Challenge题目大意: 在n*n的棋盘上放棋子,要求所有的棋子不在同一行,同一列和同一对角线上,问有多少种放法,并输出前三种情况。解题思路: 假如我们放第i个棋子,这个棋子假设放在第i行,那么这个棋子要满足什么条件才可以放下去?是不是要满足棋子不在同一行,同一列和同一对角线上这一条件?那么

洛谷 P1219 [USACO1.5]八皇后 Checker Challenge 题解-爱代码爱编程

做题地址:https://www.luogu.com.cn/problem/solution/P1219 这一题是一道dfs问题 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using nam

洛谷笔记P1219 [USACO1.5]八皇后 Checker Challenge-爱代码爱编程

题目描述 样例 因为还是做题很少,我第一下准备直接next_permutation试出来全部每行每列只有一个棋子的情况,然后再一个一个筛选,后来我跑了一次12,13.我发现光next_permutation都需要很久,这根本不可能AC。于是我就去看了题解。这里谢谢dalao的题解点这里 思路 其实,首先对于最多为13*13的棋盘,也不过就那么

洛谷P1219 [USACO1.5]八皇后 Checker Challenge进阶解法-爱代码爱编程

#include<iostream> #include<algorithm> using namespace std; int n, number; bool square[14][14]; bool isOK[14][14]; void dfs(int depth = 1) { if (n + 1 == depth) {

【洛谷P1219】[USACO1.5]八皇后 Checker Challenge-爱代码爱编程

经典深搜+回溯。 有n(n<=13)个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 测试样例: 6 样例输出: 2 4 6 1 3 5 3 6 2 5 1 4 4 1 5 2 6 3 4 A题代码: #include<iostream> using namesp

P1219 [USACO1.5]八皇后 Checker Challenge(洛谷)-爱代码爱编程

题目描述 一个如下的 6*6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是棋子放

P1219 [USACO1.5]八皇后 Checker Challenge (搜索深度优先搜索,DFS) 经典题型-爱代码爱编程

题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下: 行号 1\ 2\ 3

题解-P1219 [USACO1.5]八皇后 Checker Challenge-爱代码爱编程

P1219 [USACO1.5]八皇后 Checker Challenge 检查该坐标是否存在皇后 检查列号,a[i]存储列号,如果a[i]之中已经存在y了,代表该列已经有皇后了if(a[i]==y) return false; 检查正对角线 画图,可获得规律,正对角线上的点坐标相加结果一致if(x+y==a[i]+i) return false; 检

p1219 [usaco1.5]八皇后 checker challenge (dfs)_kuchibi的博客-爱代码爱编程

自行记录一下ww 题目链接:P1219 [USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序

dfs p1219 [usaco1.5]八皇后 checker challenge_kuangzeng的博客-爱代码爱编程

P1219 [USACO1.5]八皇后 Checker Challenge 题目:思路:使用dfs全排列 使用dfs进行遍历全部的方案,根据题目可知,边界条件设置为拿到行数等于n时,输出前三个方案并记录方案数,放置棋子数组使用二维数组存储,记录放下棋子时把整行,整列与对角线全部++,这里++的原因是回溯时如只赋为一的话,有可能会把前面选取的棋子覆盖的整行

洛谷p1219 [usaco1.5]八皇后 checker challenge_brokyyyyy的博客-爱代码爱编程

 分析: 可知每行必定只有一个皇后,所以一行一行历遍搜索即可,采用dfs。你只需要去判断这个(x,y)这个位置下他是否可以放下皇后,但是如果你用一个n*m的数组去代表他每个位置下的状态的话,这很显然是会超时的,所以重看提议我们可以发现,皇后所在的行与列,和左右的斜列是不可以的放置的,所以我们可以设定4个数组,分别代表行,列,左斜列与右斜列。如何判断同

数模笔记——论文写作-爱代码爱编程

论文写作 各模块写作要点 数学建模论文的重要性 数学建模论文的写作是数学建模中重要的一个环节。数学建模的论文是参赛队工作的全面总结,也是评委评价建模成绩的主要依据一篇好的论文应该逻辑清晰,在语言表述上清楚,数学符号标记

动态规划算法-爱代码爱编程

一、前言 动态规划是一种常用的算法,在算法领域十分重要,但对于新手来说,理解起来有一定的挑战性,这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用。 二、解析动态规划算法 1.特点 ①把原来的问题分解成了【要点相同】的子问题(这个要点可以和后面讲的状态联系起来理解) ②所有问题都只需要解决一次(解决一次就是只需要由后面所说

什么是分布式任务调度?怎样实现任务调度-爱代码爱编程

通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运

go map-爱代码爱编程

map是无序,非线程安全的,若想使用线程安全的map,使用sync.Map 一、map使用 1. 初始化 直接初始化 var m = map[int]int{} m[1] = 1 fmt.Println(m[1]) 使用make初始化(常用)   m := make(map[int]int) m[1] = 1 fmt.Println