afkesibu @ 2024-12-22 20:58:07
#include<bits/stdc++.h>
using namespace std;
int a[15],n,vis[15],vis2[15],vis3[15],ans=0;
void dfs(int x)
{
if(ans<=2)
{
for (int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
ans++;
}
if(x==n+1)
{
return ;
}
for (int i=1;i<=n;i++)
{
if(!vis[i]&&!vis2[i+x]&&!vis3[i-x+n])
{
a[x]=i;
vis[i]=1;
vis2[x+i]=1;
vis3[i-x+n]=1;
dfs(x+1);
vis[i]=0;
vis2[x+i]=0;
vis3[i-x+n]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans<<endl;
return 0;
}
求助啊,能不能指明我的代码里的问题
by ppllxx_9G @ 2024-12-22 21:16:06
if(ans<=2)
改成
if(ans<=2&&x==n+1)
而且您个数求得也不对,应该
if(x==n+1)
{
cnt++;
return ;
}
cnt 才是方案数
这样有 36 分
by ppllxx_9G @ 2024-12-22 21:22:31
数组开小了,i-x+n 会炸。
应该就没错了。
by zxckhj114514 @ 2024-12-22 21:24:34
@afkesibu
by zxckhj114514 @ 2024-12-22 21:25:27
#include<bits/stdc++.h>
using namespace std;
int a[14],vis[3][28],ans=0,n;
void eq(int x){
if(x>n){
ans++;
if(ans>3){
return;
}
else{
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
return;
}
}
for(int i=1;i<=n;i++){
if((!vis[0][i])&&(!vis[1][x+i])&&(!vis[2][x-i+n])){
a[x]=i;
vis[0][i]=1;
vis[1][x+i]=1;
vis[2][x-i+n]=1;
eq(x+1);
vis[0][i]=0;
vis[1][x+i]=0;
vis[2][x-i+n]=0;
}
}
}
int main(){
scanf("%d",&n);
eq(1);
printf("%d",ans);
return 0;
}