[USACO 6.5.1]All Latin Squares

Posted albertxwz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO 6.5.1]All Latin Squares相关的知识,希望对你有一定的参考价值。

题解

  搜索剪枝.

  置换圈个数相同及对应的置换圈内元素个数相同即视为相同方案.

代码

/*
TASK:latin
LANG:C++
*/
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int n, s[10][10], fact[] = {1, 1, 2, 6, 24, 120, 720, 5040};
bool row[10][10], col[10][10];
long long f[10][100];

long long dfs(int x, int y)
{
    if (x == n) return 1;
    int totn = 0, totlen = 1;
    if (x == 3 && y == 2)
    {
        int v[10];
        memset(v, true, sizeof(v));
        for (int i = 1; i <= n; ++i)
            if (v[i])
            {
                int len = 0, st = i;
                totn++;
                for (;;)
                {
                    len++;
                    v[st] = false;
                    st = s[2][st];
                    if (!v[st]) break;
                }
                totlen *= len;
            }
        if (f[totn][totlen] != -1) return f[totn][totlen];
    }
    long long ans = 0;
    for (int i = 1; i <= n; ++i)
        if (row[x][i] && col[y][i])
        {
            row[x][i] = col[y][i] = false;
            s[x][y] = i;
            if (y == n) ans += dfs(x + 1, 2);
            else ans += dfs(x, y + 1);
            row[x][i] = col[y][i] = true;
        }
    if (x == 3 && y == 2) return f[totn][totlen] = ans;
    else return ans;
}

int main()
{
    freopen("latin.in", "r", stdin);
    freopen("latin.out", "w", stdout);
    scanf("%d", &n);
    memset(row, true, sizeof(row));
    memset(col, true, sizeof(col));
    for (int i = 1; i <= n; ++i)
    {
        row[i][i] = false;
        col[i][i] = false;
        s[1][i] = s[i][1] = i;
    }
    memset(f, -1, sizeof(f));
    cout << dfs(2, 2) * fact[n-1] << endl;
    return 0;
}

 

以上是关于[USACO 6.5.1]All Latin Squares的主要内容,如果未能解决你的问题,请参考以下文章

liunx SQ备份脚本

mysqldump之后的MYSQL latin1和utf8

usaco题目分享——Agri-Net

[LeetCode] 1277. Count Square Submatrices with All Ones

sql中用union all最多可以合并几个表

Google Web Fonts 字体中的“latin”与“latin-extended”字形支持的语言?