USACO6.5.1 All Latin Squares(latin)

本文探讨了置换群的优化剪枝技术,特别针对最后一个点的应用进行了深入研究。作者通过创建表格的方式,对n=7的情况进行了具体实现,并分享了优化代码的大神级实践,包括使用C++编程语言进行高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搜索就好了吧,正解是置换群的优化剪枝,只对于最后一个点用得着,所以渣渣就自己给 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值