xxxxyz6667 @ 2024-07-10 14:01:57
#include<bits/stdc++.h>
using namespace std;
//int i=1;
int a[140],f[150][150],n;
void dfs(int i)
{
if(i==n+1)//?
{
for(int k=1;k<=n;k++)
{
cout<<a[k]<<" ";
}
return ;
}
for(int k=1;k<=n;k++)
{
if(f[i][k]==1) continue;
if(f[i-1][k]==1) continue;//下和右不用管,尽情占领
//if(f[i+1][j]==1) continue;
if(f[i][k-1]==1) continue;
//if(f[i][j+1]==1) continue;
if(f[i-1][k-1]==1) continue;//左上角
if(f[i+1][k-1]==1) continue;//右上角
f[i][k]=1;//占领这个位置
a[i]=k;
//cout<<i<<k;
//f[i][k]=f[i-1][k]=f[i][k-1]=f[i-1][k-1]=f[i+1][k-1]=1;
dfs(i+1);
f[i][k]=f[i-1][k]=f[i][k-1]=f[i-1][k-1]=f[i+1][k-1]=0;//
a[i]=0; //害
}
}
int main()
{
cin>>n;
//dfs(i);
//for(int j=1;j<=3;j++)
//{
dfs(1);
//}
}
by BlackWuKong @ 2024-07-10 14:04:45
我的代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,ans=0,a[22],tot[22],vis1[44],vis2[44];
void dfs(int x){
if (x>n){
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 (tot[y]==0&&vis1[x-y+n]==0&&vis2[x+y]==0){
tot[y]=1;
vis1[x-y+n]=1;
vis2[x+y]=1;
a[x]=y;
dfs(x+1);
tot[y]=0;
vis1[x-y+n]=0;
vis2[x+y]=0;
}
}
return ;
}
int main(){
cin>>n;
dfs(1);
cout<<ans;
return 0;
}
求关
by a18981826590 @ 2024-07-10 14:05:07
@xxxxyz6667
=1改为++
=0改为--
by a18981826590 @ 2024-07-10 14:06:01
@xxxxyz6667
#include<bits/stdc++.h>
using namespace std;
int a[20][20],n,s=0;
void x(int y){
if(y>n){
if(s<3){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==-1) printf("%d ",j);
}
}
printf("\n");
}
s++;
return;
}
for(int i=1;i<=n;i++){
if(a[y][i]==0){
for(int j=1;j<=n;j++) a[y][j]++;
for(int j=1;j<=n;j++) a[j][i]++;
for(int j=max(1,y-i+1);j<=min(n,n+y-i);j++) a[j][j+i-y]++;
for(int j=max(1,y+i-n);j<=min(n,y+i-1);j++) a[j][y+i-j]++;
a[y][i]=-1;
x(y+1);
for(int j=1;j<=n;j++) a[y][j]--;
for(int j=1;j<=n;j++) a[j][i]--;
for(int j=max(1,y-i+1);j<=min(n,n+y-i);j++) a[j][j+i-y]--;
for(int j=max(1,y+i-n);j<=min(n,y+i-1);j++) a[j][y+i-j]--;
a[y][i]=0;
}
}
}
int main(){
scanf("%d",&n);
x(1);
printf("%d",s);
return 0;
}