USACO6.5.1 All Latin Squares(latin)

来源:互联网 发布:西安华信软件 编辑:程序博客网 时间:2024/06/05 19:55

搜索就好了吧,正解是置换群的优化剪枝,只对于最后一个点用得着,所以渣渣就自己给 n=7 打了个表

置换群

http://baike.baidu.com/link?url=3O0MeCCYhjxS4525-CTNAAf-lR4gmfeTKh6kdt4cNOgF18tNxo1183jjRZJuHHJJ7FAfvfqiQrNiWVdlhUOxA_

大神置换群优化代码

http://www.cppblog.com/jericho/archive/2011/02/14/140034.html


/*ID:xsy97051LANG: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;}


0 0