(洛谷)1219 [USACO1.5]八皇后 Checker Challenge

本文介绍了一种寻找跳棋棋盘上所有可能布局的算法,通过递归回溯的方法,确保每行、每列及对角线上有且仅有一个棋子,展示了具体的C++实现代码,并输出前三个解及解的总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
在这里插入图片描述

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

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

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

输入格式
一行一个正整数 n,表示棋盘是 n×n 大小的。

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

输入输出样例
输入 #1
6
输出 #1
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
代码如下:

#include<bits/stdc++.h>
using namespace std;
long long a[30],c[30],d1[30],d2[30],n,ans;
void ffx(int a1){
	if(a1>n){
		for(int i=1;i<=n&&ans<3;i++){
			cout<<a[i]<<" ";
		}
		if(ans<3){
			cout<<endl;
		}
		ans++;
		return;
	}
	for(int i=1;i<=n;i++){
		if(c[i]!=1&&d1[a1-i+n]!=1&&d2[a1+i]!=1){
			a[a1]=i;
			c[i]=1;
			d1[a1-i+n]=1;
			d2[a1+i]=1;
			ffx(a1+1);
			a[a1]=0;
			c[i]=0;
			d1[a1-i+n]=0;
			d2[a1+i]=0;
		}
	}
}
int main(){
	cin>>n;
	ffx(1);
	cout<<ans;
	return 0;
}

是不是很简单呢?

我的洛谷团队:https://www.luogu.com.cn/team/34776#main

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值