求助
  • 板块学术版
  • 楼主Ming_Xuan1988
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/9 11:36
  • 上次更新2024/8/9 13:12:26
查看原帖
求助
1094796
Ming_Xuan1988楼主2024/8/9 11:36

题目

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#define ll long long
#define ing int
#define gets(S) fgets(S,sizeof(S),stdin)
#define ot cout
#define in cin

using namespace std;

ing n;
ing a[30];//表示放的位置,下标表示行 eg. a[1]=2 表示第一行的皇后放在第二列
ing b[30];//标记同列
ing c[30];//左上到右下的对角线 i-j的差是一样的 i-j+n 加上n保证下标是整数
ing d[30];//右上到左下的对角线 i+j的和是一样的
ing ans;

void dfs(ing i) { //i表示正在放第i行的皇后
	if (i == n + 1) {
		ans++;
		if (ans <= 3) {
			for (int i = 1; i <= n; i++) {
				cout << a[i] << " ";
			}
			cout << endl;
		}
		return;
	}
	//放皇后,枚举范围
	for (ing j = 1; j <= n; j++) {
		if (!b[j] && !c[i - j + n] && !d[i + j]) {
			a[i] = j; //放皇后
			//处理标记
			b[j] = 1;
			c[i - j + n] = 1;
			d[i + j] = 1;//对角线 
			dfs(i + 1); //放下一个皇后
			b[j] = 0;
			c[i - j + n] = 0;
			d[i - j ] = 0;//回溯 
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	in >> n;
	dfs(1);//第一个皇后 
	cout << ans;
	return 0;
}

2024/8/9 11:36
加载中...