水星湖 @ 2023-08-25 16:55:50
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,p[15],cnt,b[15];
double xie(int x1,int y1,int x2,int y2)//斜率
{
return abs(x1-x2)/abs(y1-y2);
}
bool check()
{
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
if(++b[p[i]]==2)
return 0; //保证不在同一列
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(xie(p[i],p[j],i,j)==1||xie(p[i],p[j],i,j)==-1)
return 0;//保证不在同一对角线上
}
return 1;
}
void dfs(int step)
{
if(step>n)
{
if(check())
{
cnt++;
if(cnt<=3)
{
for(int i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
}
}
return;
}
for(int i=1;i<=n;i++)//保证不在同一行
{
p[step] = i;
dfs(step+1);
}
}
int main(){
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}
by Null_h @ 2023-08-25 18:22:51
很傻的错误(但调了好久)
1.斜率部分顺序有误
2.没转double
3.思路有误,会TLE
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,p[15],cnt,b[15];
double xie(int y1,int y2,int x1,int x2)//斜率
{
return double(abs(x1-x2))/abs(y1-y2);
}
bool check()
{
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
if(++b[p[i]]==2)
return 0; //保证不在同一列
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(xie(p[i],p[j],i,j)==1)
return 0;//保证不在同一对角线上
}
return 1;
}
void dfs(int step)
{
if(step>n)
{
if(check())
{
cnt++;
if(cnt<=3)
{
for(int i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
}
}
return;
}
for(int i=1;i<=n;i++)//保证不在同一行
{
p[step] = i;
dfs(step+1);
}
}
int main(){
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}
by 水星湖 @ 2023-09-08 19:30:21
@kdqs8218 好耐心的大佬 关注了
by 水星湖 @ 2023-09-08 19:34:58
@kdqs8218 为什么在斜率那块不用判断斜率等于 -1 呢
by Null_h @ 2023-09-08 20:39:03
@zrczrczrczrc 既然加了abs,那必然是正数啊
by 水星湖 @ 2023-09-08 21:27:21
@kdqs8218 哦哦哈哈哈傻了