Charlie0429 @ 2024-02-21 20:55:34
#include<bits/stdc++.h>
using namespace std;
int n,c[13];
int tot=0;
int sum=0;
void dfs(int step)
{
if(step==n)
{
tot++;
sum++;
if(sum<=3)
{
for(int i=1;i<=step;i++)
{
cout<<c[i]<<' ';
}
cout<<'\n';
}
}else
{
for(int i=1;i<=n;i++)
{
int ok=1;
c[step]=i;
for(int j=0;j<step;j++)
{
if(c[step]==c[j]||step-c[step]==j-c[j]||step+c[step]==j+c[j])
{
ok=0;
break;
}
}
if(ok==1) dfs(step+1);
}
}
}
int main()
{
cin>>n;
dfs(0);
cout<<tot;
return 0;
}
by propitious @ 2024-02-21 22:09:18
dfs应该从1开始,还有终止条件应该是step>n不然少判断一行,改成下面这样就ac了
#include<bits/stdc++.h>
using namespace std;
int n,c[14];
int sum=0;
void dfs(int step)
{
if(step>n)
{
sum++;
if(sum<=3)
{
for(int i=1;i<=n;i++)
{
cout<<c[i]<<' ';
}
cout<<'\n';
}
}else
{
for(int i=1;i<=n;i++)
{
int ok=1;
c[step]=i;
for(int j=1;j<step;j++)
{
if(c[step]==c[j]||abs(step-j)==abs(c[step]-c[j]))
{
ok=0;
break;
}
}
if(ok==1) dfs(step+1);
}
}
}
int main()
{
cin>>n;
memset(c,0,sizeof(c));
dfs(1);
cout<<sum;
return 0;
}
by propitious @ 2024-02-21 22:10:40
@propitious 还有那个tot可以不用重复记数。if的判断里改简洁了点