拉丁矩阵

#include <stdio.h>
#define N 6                                             /*确定N值*/
int main1()
{
	int i, j, k, t;
	printf( "The possble Latin Squares of order %d are:\n", N );
	for ( j = 0; j < N; j++ )                       /*构造N个不同的拉丁方阵*/
	{
		for ( i = 0; i < N; i++ )
		{
			t = (i + j) % N;                /*确定该拉丁方阵第i 行的第一个元素的值*/
			for ( k = 0; k < N; k++ )       /*按照环的形式输出该行中的各个元素*/
				printf( "%d", (k + t) % N + 1 );
			printf( "\n" );
		}
		printf( "\n" );
	}
}

int  main2()
{
	int	a[2 * N];
	int	b[N][N];
	int	i, j, k = 0;
	a[0] = 2;
	/* for( i=0;i<2*N;i++) a[i]=i%N+1; */
	for ( i = 0; i < 2 * N; i++ )
	{
		a[i] = i % 7 + 2;
		if ( a[i] > N )
			a[i] %= N;
	}

	for ( i = 0; i < N; i++ )
	{
		k = i;
		for ( j = 0; j < N; j++ )
		{
			b[i][j] = a[k++];
		}
	}
	for ( i = 0; i < N; i++ )
	{
		for ( j = 0; j < N; j++ )
		{
			printf( " %d ", b[i][j] );
		}
		printf( "\n" );
	}

	return(0);
}

int main()
{
	int	b[N][N];
	int	i, j, k = 0;

	for ( i = 5; i >= 0; i-- )
	{
		for ( j = 0; j < N; j++ )
		{
			b[j][i] = (i + j + 7) % 6 + 1;
		}
	}
	for ( i = 5; i >= 0; i-- )
	{
		for ( j = 0; j < N; j++ )
		{
			b[j][i] = (i + j + 5) % 6 + 1;
		}
	}

	for ( i = 0; i < N; i++ )
	{
		for ( j = 0; j < N; j++ )
		{
			printf( " %d ", b[i][j] );
		}
		printf( "\n" );
	}

	return(0);
}
时间: 2024-10-09 23:47:22

拉丁矩阵的相关文章

拉丁矩阵问题 利用回溯法的C++实现方案

这两天正好在赶算法设计的作业,这里把做的几个需要写代码的题放上来,方便以后查看. 1.题目要求 2.算法思想 这个题目基本思想是 利用回溯法,对于 m 行 n 列, 本质上就是一个二维数组, 我们可以将问题的解写成 x[1],x[2],x[3] - x[m*n], 那么对于每个点 x[i] 的取值实际上是 [1, n], 套用回溯法的算法框架,这里的 约束条件 ,就是同行,同列 没有相同的取值, 并且这里没有优化目标,只要类似 N后问题找出所有解就可以了. 另外,回溯时候的边界条件,需要特别注意

回溯法求解拉丁矩阵问题

问题描述: 如图所示,一个4阶Latin方是一个4X4的方格,在它的每个方格内填入1,2,3或4,并使得每个数字在每行.每列都恰好出现一次.用回溯法求出所有第一行为1,2,3,4的所有4阶Latin方.将每个解的第2行到第4行的数字从左到右写成一个序列.如图中的解是<3,4,1,2,4,3,2,1,2,1,4,3>. 1 2 3 4 3 4 1 2 4 3 2 1 2 1 4 3 本打算随便弄几行代码应付上去,没想到最后给编出来了.回溯算法思想以及实现过程都不是太难. 个人觉得比较重要的部分是

【组合数学】 06 - 组合设计

计数问题其实只是组合数学中的一小部分,以上也仅仅介绍了比较经典的结论.组合问题复杂多变,它们之间也少有联系,所以把组合数学称作一门学科并不准确.组合难题也会出现在各种益智趣题或竞赛难题中,随随便便就会出现一些未解的难题,所以我们也将止步于此.在结束本课之前,我决定再窥探一下组合问题中的一大类:组合设计.这些问题的关注点在如何布局元素,以满足一些特定要求,它们已然构成了组合学的众多分支. 1. 0-1矩阵 1.1 关联矩阵的秩 有的问题需要在两个集合\(A,B\)间建立联系,如果把\(A,B\)的

【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在数据类型的后面,也可以在数组名称的后面,其它的依次类推. 例如: int[][] map; char c[][]; 和一维数组一样,数组声明以后在内存中没有分配具体的存储空间,也没有设定数组的长度.  -------------------------------------------------

算法:拉丁方阵(Latin Square)

拉丁方阵(英语:Latin square)是一种 n × n 的方阵,在这种 n × n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同一列里只出现一次.以下是两个拉丁方阵举例: 拉丁方阵有此名称是因为瑞士数学家和物理学家欧拉使用拉丁字母来做为拉丁方阵里的元素的符号. 算法步骤: 在第一行中,数字从 1 到 n 连续存储. 第二行,数字向右移动一列.即 1 现在存储在第二列,依此类推. 在第三行中,数字向右移动两列.即 1 现在存储在第三列,依此类推. 对于其余的行,我们将以相同

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉.可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分: 一.[拖动]   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的.以下是核心代码(及效果图): 1 /// <summary> 2 /// 这里TitleBar代指最

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma