digua2010 @ 2024-02-24 20:18:28
#include <bits/stdc++.h>
using namespace std;
// 意如其名,f是棋盘,shu是竖,接下来是右边的斜,左边的斜,t判断是否输出三组数据
bool f[15][15], shu[15], r_xie[20], l_xie[20], t = 0;
long long n, sum;
// 输出函数
void print() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (f[i][j]) cout << j + 1 << ' ';
}
}
cout << "\n";
}
void dfs(int x) {
// 如果到指定行就输出
if (x > n) {
// 判断是否输出三组(要一直计数最后输出)
sum ++;
if (sum > 3) {
t = 1;
return;
}
print();
return ;
}
// 遍历每一列
for (int i = 0; i < n; i++) {
// 如果列、左斜、右斜都没有皇后进入下一个递归
if (!shu[i] && !r_xie[x - i] && !l_xie[x + i]) {
// 标记
shu[i] = 1;
r_xie[x - i] = 1;
l_xie[x + i] = 1;
f[x - 1][i] = 1;
dfs(x + 1);
// 解除标记
f[x - 1][i] = 0;
shu[i] = 0;
r_xie[x - i] = 0;
l_xie[x + i] = 0;
}
}
}
int main() {
cin >> n;
// 给出初始行
dfs(1);
cout << sum;
return 0;
}
by DL_Lingkong @ 2024-02-27 21:03:24
@digua2010 呀这不地瓜吗,这么巧,我也在水这题
by DL_Lingkong @ 2024-02-27 21:14:32
@digua2010 看我的(虽然马蜂m³说很奇怪)
#include <iostream>
using namespace std;
bool visy[1145],visxpy[1145],visxmy[1145];
int n,ans,a[1145],ind;
void dfs(int x)
{
if(x == n + 1)
{
ans++;
if(ans <= 3)
{
for(int i = 1;i <= n;i++)
{
cout << a[i] << ' ';
}
cout << endl;
}
return ;
}
for(int y = 1;y <= n;y++)
{
if(visy[y] || visxpy[x + y] || visxmy[x - y + n])
{
continue;
}
visy[y] = visxpy[x + y] = visxmy[x - y + n] = true;
a[++ind] = y;
dfs(x + 1);
visy[y] = visxpy[x + y] = visxmy[x - y + n] = false;
ind--;
}
return ;
}
void be() // init & input
{
cin >> n;
return ;
}
void kin() // programming
{
dfs(1);
return ;
}
void ei() // output
{
cout << ans << endl;
return ;
}
int main()
{
be();
kin();
ei();
return 0;
}
by digua2010 @ 2024-02-27 21:42:51
《处处皆是比博燃》
谢咯?谢喽。