aton_puck @ 2023-08-06 15:41:38
#include <iostream>
using namespace std;
const int N= 13;
bool st[N][N];
bool COL[N]; //列
bool diag[N*2];//对角,左下到右上
bool undiag[N*2]; //反对角,左上到右下
int n;
int cnt=3; //输出前三个方案
int res=0; //总方案数
void dfs(int u) //表示遍历到了第u行(从第0行开始)
{
if(u == n) //放完了
{
res++;
if(--cnt)
{
for(int i=0 ; i<n ; i++)
for(int j=0 ; j<n ; j++)
if(st[i][j])
cout<<j+1<<" ";
cout<<endl;
}
return;
}
for(int i=0 ; i<n ; i++)
{
if(!COL[i] && !diag[u+i] && !undiag[i-u+n-1]) //该位置可以放皇后
{
COL[i] = diag[u+i] = undiag[i-u+n-1] = true; //皇后放下
st[u][i] = true;
dfs(u+1);
COL[i] = diag[u+i] = undiag[i-u+n-1] = false; //恢复
st[u][i] = false;
}
}
}
int main()
{
cin>>n;
dfs(0);
cout<<res<<endl;
return 0;
}
我输出的三行和样例的顺序不一样,不会因为这个吧?
by Gumingyi08 @ 2023-08-06 16:05:45
这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 个解。最后一行是解的总个数。
by ZhuZining_king @ 2023-08-20 12:04:30
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N=25;
int a[N];//保存哪行那列的
bool lie[N],zs[N],zx[N];//lie:列,zs:左上到右下,zx:左下到右上
int n,tot=0;//tot:记录答案个数
void f(int k)//f表示前k个已经排好了,接下来准备排k+1个
{
if (k == n)//全排好了
{
tot++;//答案数增加
if (tot <= 3)//输出前三个答案
{
for (int i=1;i<=n;i++)
{
cout << a[i] << ' ';
}
cout << endl;
}
return ;//结束
}
for (int i=1;i<=n;i++)//如果没有,枚举每个可能,准备在k+1行填充
{
if (lie[i] || zs[i-k-1+n] || zx[i+k+1])//如果填充,就continue掉
{
continue;
}
a[k+1]=i;//反之回溯掉
lie[i]=zs[i-k-1+n]=zx[i+k+1]=true;
f(k+1);
lie[i]=zs[i-k-1+n]=zx[i+k+1]=false;
}
}
int main()
{
cin >> n;
f(0);
cout << tot << endl;
return 0;
}