题目:八皇后

本题解法:

思路:递归、打表(降低时间复杂度)

step1:放置第0号皇后于第i(1~8)列,并压入用于保存所有皇后对应放置的列的序列所在数组queenVec中

step2:放置第n+1号(1~7)皇后(条件:不得与其他任何一个皇后处在同一行同一列且同一斜线上)

重复step2直至所有皇后均放完

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
vector<vector<int>> queenVec;//用于存放所有皇后序列

void DFSFindQueen(vector<int> &queen,int pos) {
	for (int i = 1; i <= 8; ++i) {//i是第pos号皇后打算放的列
		bool isOK = true;
		for (int j = 0; j < pos; ++j) {//用来遍历之前已经放好的皇后0~pos-1
			if (queen[j] == i || //第j号皇后 和pos皇后在同一列
				pos - j == queen[j] - i || //在一条斜对角线上
				pos - j == i - queen[j]) {
				isOK = false;
				break;
			}
		}
		if (isOK == true) {
			queen.push_back(i);
			if (pos == 7) {
				queenVec.push_back(queen);
				printf("\"");
				for (int k = 0; k < 8; ++k) {
					printf("%d", queen[k]);
				}
				printf("\",\n");
			}
			else {
				DFSFindQueen(queen, pos + 1);
			}
			queen.pop_back();
		}
	}
}
//打表
vector<string> queenVecNew = {
"15863724",
"16837425",
"17468253",
"17582463",
"24683175",
"25713864",
"25741863",
"26174835",
"26831475",
"27368514",
"27581463",
"28613574",
"31758246",
"35281746",
"35286471",
"35714286",
"35841726",
"36258174",
"36271485",
"36275184",
"36418572",
"36428571",
"36814752",
"36815724",
"36824175",
"37285146",
"37286415",
"38471625",
"41582736",
"41586372",
"42586137",
"42736815",
"42736851",
"42751863",
"42857136",
"42861357",
"46152837",
"46827135",
"46831752",
"47185263",
"47382516",
"47526138",
"47531682",
"48136275",
"48157263",
"48531726",
"51468273",
"51842736",
"51863724",
"52468317",
"52473861",
"52617483",
"52814736",
"53168247",
"53172864",
"53847162",
"57138642",
"57142863",
"57248136",
"57263148",
"57263184",
"57413862",
"58413627",
"58417263",
"61528374",
"62713584",
"62714853",
"63175824",
"63184275",
"63185247",
"63571428",
"63581427",
"63724815",
"63728514",
"63741825",
"64158273",
"64285713",
"64713528",
"64718253",
"68241753",
"71386425",
"72418536",
"72631485",
"73168524",
"73825164",
"74258136",
"74286135",
"75316824",
"82417536",
"82531746",
"83162574",
"84136275"
};
int main() {
	vector<int> queen;
	//DFSFindQueen(queen, 0);
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; ++i) {
		int m;
		scanf("%d", &m);
		printf("%s\n", queenVecNew[m-1].c_str());
	}
	return 0;
}

代码运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值