P1219 [USACO1.5]八皇后 Checker Challenge

题目描述

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

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

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

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

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

6

输出 #1复制

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

 

 

思路

搜索加回溯完成

观察,我们需要标记已经占据的列和斜边,斜边分为左斜边和右斜边,它们都有各自的规律。 

左斜边(/)同一条边上 行列和相同

右斜边(\)同一条边上 行列差相同

那么,我们可以使用数组来表示,R[i-j+n],L[i+j],每次遍历,相应的在数组位置那里标记一次。如果下一个放置位置还是那条斜边,则会根据标记放弃这次位置。

我们可以分别建立三个数组分别标记,不能走的列,左斜边,右斜边,再来一个数组储存放的值。

#include <iostream>
const int MAX = 200;
using namespace std;
int n;
int ans = 0;
int set[MAX], ls[MAX], rs[MAX], result[MAX];

void print_result()
{
	if (ans <= 2) {
		for (int i = 1; i <= n; i++) {
			cout << result[i] << " ";
		}
		cout << endl;
	}
		
	
}

void dfs(int row)
{
	if (n < row) { //所有行都放完了
		print_result();//打印这一次方案的数字
		ans++;
	}
	else {
		for (int col = 1; col <= n; col++) {//遍历每行的所有位置
			if (!set[col] && !ls[col + row] && !rs[col - row + n]) {
				result[row] = col;//记录改行所放的列的序号
				set[col] = 1;//该列被标记 
				ls[col + row] = 1;//该斜边被标记 
				rs[col - row + n] = 1;//该斜边被标记 
				dfs(row + 1);//下一行搜索 
				set[col] = 0;//回溯 
				ls[col + row] = 0;//回溯
				rs[col - row + n] = 0;//回溯
			}
		}
	}
}

int main()
{
	cin >> n;
	dfs(1);//第一行开始搜索
	cout << ans << endl;

}

 

已标记关键词 清除标记
相关推荐
<p> <strong><span style="background-color:#FFFFFF;color:#E53333;font-size:24px;">本页面购买不发书!!!仅为视频课购买!!!</span></strong> </p> <p> <strong><span style="color:#E53333;font-size:18px;">请务必到</span></strong><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><strong><span style="color:#E53333;font-size:18px;">https://edu.csdn.net/bundled/detail/49</span></strong></a><strong><span style="color:#E53333;font-size:18px;">下单购买课+书。</span></strong> </p> <p> <span style="font-size:14px;">本页面,仅为观看视频页面,如需一并购买图书,请</span><span style="font-size:14px;">务必到</span><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><span style="font-size:14px;">https://edu.csdn.net/bundled/detail/49</span></a><span style="font-size:14px;">下单购买课程+图书!!!</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">疯狂Python精讲课程覆盖《疯狂Python讲义》全书的主体内容。</span> </p> <span style="font-size:14px;">内容包括Python基本数据类型、Python列表、元组和字典、流程控制、函数式编程、面向对象编程、文件读写、异常控制、数据库编程、并发编程与网络编程、数据可视化分析、Python爬虫等。</span><br /> <span style="font-size:14px;"> 全套课程从Python基础开始介绍,逐步步入当前就业热点。将会带着大家从Python基础语法开始学习,为每个知识点都提供对应的代码实操、代码练习,逐步过渡到文件IO、数据库编程、并发编程、网络编程、数据分 析和网络爬虫等内容,本课程会从小案例起,至爬虫、数据分析案例终、以Python知识体系作为内在逻辑,以Python案例作为学习方式,最终达到“知行合一”。</span><br />
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页