搜索就好了吧,正解是置换群的优化剪枝,只对于最后一个点用得着,所以渣渣就自己给 n=7 打了个表
置换群
http://baike.baidu.com/link?url=3O0MeCCYhjxS4525-CTNAAf-lR4gmfeTKh6kdt4cNOgF18tNxo1183jjRZJuHHJJ7FAfvfqiQrNiWVdlhUOxA_
大神置换群优化代码
http://www.cppblog.com/jericho/archive/2011/02/14/140034.html
/*
ID:xsy97051
LANG:C++
TASK:latin
*/
#include <cstdio>
#include <iostream>
using namespace std;
const int N[8]={1,1,2,6,24,120,720,1440};
bool zong[8][8],hen[8][8];
long long n,cnt;
void next(int &x,int &y)
{
y++;
if (y>n)
{
y=2;
x++;
}
}
void dfs(int x,int y)
{
if(x>=n)
{
cnt++;
return;
}
int xl=x,yl=y;
next(xl,yl);
for(int i=1;i<=n;i++)
if(!hen[x][i] && !zong[y][i])
{
hen[x][i]=zong[y][i]=1;
dfs(xl,yl);
hen[x][i]=zong[y][i]=0;
}
}
int main()
{
freopen("latin.in","r",stdin);
freopen("latin.out","w",stdout);
cin>>n;
if(n==7)//打表,跑了22s,正解为置换圈,不会..
{
cout<<"12198297600"<<endl;
return 0;
}
for(int i=1;i<=n;i++)
zong[i][i]=hen[i][i]=1;
dfs(2,2);
cout<<N[n-1]*cnt<<endl;
}