All Latin Squares

题意:摘自NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/latin

描述

一种正方形的数字编排

1 2 3 4 5
2 1 4 5 3
3 4 5 1 2
4 5 2 3 1
5 3 1 2 4

是一个5×5的拉丁幻方,即每个1到5的整数在每行每列都出现且出现一次。 斜体文字 写个程序计算N×N的的拉丁幻方的总数且要求第一行是:

1 2 3 4 5.......N

2<=N<=7

[编辑]格式

PROGRAM NAME: latin

INPUT FORMAT

一行包含一个整数N

OUTPUT FORMAT

只有一行,表示拉丁正方形的个数,且拉丁正方形的第一行为 1 2 3 . . . N.

[编辑]SAMPLE INPUT (file latin.in)

5

[编辑]SAMPLE OUTPUT (file latin.out)

1344


解题思路:

  1. 完全参考NOCOW题解“优化技巧

代码

/*
ID: zc.rene1
LANG: C
PROG: latin
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_N 7

int N;
int visited_row[MAX_N + 1][MAX_N + 1];
int visited_col[MAX_N + 1][MAX_N + 1];
long long total_num = 0;

int seq[MAX_N + 1];
int visited[MAX_N + 1];
int count[MAX_N + 1];
int global_index;

void GetInput(FILE *fin)
{
    int i;
    memset(visited_row, 0, (MAX_N + 1) * (MAX_N + 1) * sizeof(int));
    memset(visited_col, 0, (MAX_N + 1) * (MAX_N + 1) * sizeof(int));
    memset(count, 0, (MAX_N + 1) * sizeof(int));
    seq[1] = 2;

    fscanf(fin, "%d", &N);
    for (i=1; i<=N; i++)
    {
	visited_row[i][i] = 1;
	visited_col[i][i] = 1;
    }
}

void GetIndex(void)
{
    int i, j, len;
    global_index = 2;

    memset(visited, 0, (MAX_N + 1) * sizeof(int));

    for (i=1; i<=N; i++)
    {
	if (visited[i] == 0)
	{
	    len = 0;
	    j = i;
	    do
	    {
		visited[j] = 1;
		j = seq[j];
		len++;
	    }while (visited[j] == 0);
	    if (len > global_index)
	    {
		global_index = len;
	    }
	}
    }
}

void Search(int x, int y)
{
    int i;

    for (i=1; i<=N; i++)
    {
	if (visited_row[x][i] + visited_col[y][i] == 0)
	{
	    if (x == 2)
	    {
		seq[y] = i;
		if (y == N)
		{
		    GetIndex();
		    if (count[global_index] > 0)
		    {
			total_num += count[global_index];
			return ;
		    }
		}
	    }

	    visited_row[x][i] = 1;
	    visited_col[y][i] = 1;

	    if (y == N)
	    {
		if (x == N - 1)
		{
		    count[global_index]++;
		    total_num++;
		}
		else
		{
		    Search(x + 1, 2);
		}
	    }
	    else
	    {
		Search(x, y + 1);
	    }

	    visited_row[x][i] = 0;
	    visited_col[y][i] = 0;
	}
    }
}

int main(void)
{
    FILE *fin, *fout;
    int i;

    fin = fopen("latin.in", "r");
    fout = fopen("latin.out", "w");

    GetInput(fin);
    Search(2, 2);

    for (i=2; i<N; i++)
    {
	total_num *= i;
    }
    if (N == 2)
    {
	total_num = 1;
    }

    fprintf(fout, "%lld\n", total_num);
    return 0;
}







### 回答1: `squares.append()`是Python语言中列表对象的一个方法,用于在列表末尾添加一个元素。例如,如果你有一个名为"squares"的列表,并且想在其末尾添加数字9,你可以使用以下代码: ``` squares.append(9) ``` 这将在列表末尾添加数字9。 ### 回答2: 在Python中,squares.append()是一个列表方法,用于向列表中添加元素。该方法接受一个参数,即要添加的元素,并将该元素添加到列表的末尾。 例如,假设我们有一个空列表squares。我们可以使用以下代码将一个元素添加到列表中: squares = [] squares.append(4) 现在,squares列表将包含一个元素,即数字4。我们可以进一步使用append()方法来添加更多的元素到列表中。例如: squares.append(9) squares.append(16) squares.append(25) 现在,squares列表将依次包含数字4、9、16和25。 总结而言,squares.append()是一个有用的列表方法,它允许我们在Python中向列表中添加元素。无论列表是否为空,我们都可以使用append()方法将元素添加到列表的末尾。 ### 回答3: `python squares.append`是Python语言中的一个方法,用于将一个元素追加到列表(list)中。在使用该方法时,需要先创建一个列表对象,并且可以在括号内指定要追加的元素。 例如,以下是一个使用`squares.append`的示例: ```python squares = [] # 创建一个空的列表对象 # 使用append方法将元素依次追加到列表中 squares.append(1) squares.append(4) squares.append(9) squares.append(16) print(squares) # 输出结果为:[1, 4, 9, 16] ``` 在上述示例中,我们首先创建了一个空的列表对象`squares`。然后,使用`squares.append`方法依次向列表中追加了四个元素,分别是1、4、9和16。最后,通过`print(squares)`将列表内容打印输出,结果为`[1, 4, 9, 16]`。 总而言之,`python squares.append`是用于将一个元素追加到列表中的Python方法,可以方便地扩充列表的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值