题解
2025-05-07 18:12:16
发布于:广东
10阅读
0回复
0点赞
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,A[20],s,ans,tot,B[20],tt;
int v[23],tong[60],out[60][10];
inline void Check(int id){
if(n>4&&(!v[2]||(!v[3]&&!v[4])||(!v[5]&&!v[6]&&!v[7]&&!v[8]))) return;
register int i,l,r,u;
for(i=n+1;i<=n<<1;++i) A[i]=A[i-n];
for(i=1;i<=n<<1;++i) B[i]=B[i-1]+A[i];
for(l=1;l<=n;++l)
for(r=l,u=l+n-1;r<=u;++r)
tong[B[r]-B[l-1]]=id;
for(i=1;i<=ans;++i)
if(tong[i]!=id) return;tot++;
for(i=1;i<=n;i++) out[tot][i]=A[i];
}
void DFS(int x){
if(x>n) {if(s==ans) Check(++tt);return;}
for(int i=1;i<=22;++i)
if(!v[i])
{
A[x]=i;v[i]=1;s+=i;
if(s<=ans) DFS(x+1);
v[i]=0;s-=i;
}
}
void work1();
int main(){
cin>>n;A[1]=1;s=1;
printf("%d\n",ans=n*(n-1)+1);
if(n==8)work1();DFS(2);
for(int i=1;i<=tot;i++,puts(""))
for(int j=1;j<=n;j++)
printf("%d ",out[i][j]);
}
void work1(){
printf("1 2 10 19 4 7 9 5\n1 3 5 11 2 12 17 6\n");
printf("1 3 8 2 16 7 15 5\n1 4 2 10 18 3 11 8\n");
printf("1 4 22 7 3 6 2 12\n1 5 9 7 4 19 10 2\n");
printf("1 5 15 7 16 2 8 3\n1 6 12 4 21 3 2 8\n");
printf("1 6 17 12 2 11 5 3\n1 8 2 3 21 4 12 6\n");
printf("1 8 11 3 18 10 2 4\n1 12 2 6 3 7 22 4\n");
exit(0);
}
这里空空如也
有帮助,赞一个