问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

构造一个3*3的拉丁方阵,使该矩阵中的每行每列中数字1,2,3都只出现一次。30分不成敬意。

发布网友 发布时间:2022-05-20 16:17

我来回答

2个回答

热心网友 时间:2023-10-31 20:49

根本不止3种情况,应该有12种。
3 2 1
2 1 3
1 3 2

3 2 1
1 3 2
2 1 3

2 1 3
3 2 1
1 3 2

2 1 3
1 3 2
3 2 1

1 3 2
3 2 1
2 1 3

1 3 2
2 1 3
3 2 1

1 2 3
2 3 1
3 1 2

1 2 3
3 1 2
2 3 1

2 3 1
1 2 3
3 1 2

2 3 1
3 1 2
1 2 3

3 1 2
1 2 3
2 3 1

3 1 2
2 3 1
1 2 3
程序如下:
#include <stdio.h>
#include <string.h>

void init(int seed[3], int a[3][3])
{
int i, j;
for(i=0; i<3; i++){
for(j=0; j<3; j++){
a[i][j] = seed[(i+j)%3];
}
}
}
void print(int x[3][3])
{
int i, j;
for(i=0; i<3; i++){
for(j=0; j<3; j++){
printf("%d ", x[i][j]);
}
printf("\n");
}
}
void show(int seed[3])
{
int x[3][3];
int a[3][3];
int i, j, k;
init(seed, a);
for(i=0; i<3; i++){
for(j=0; j<3; j++){
if(j!=i){
k=3-i-j;
memcpy(x[0],a[i],sizeof(int[3]));
memcpy(x[1],a[j],sizeof(int[3]));
memcpy(x[2],a[k],sizeof(int[3]));
print(x);
printf("\n");
}
}
}
}
void main()
{
int i;
int asc[3]={1,2,3}, dsc[3]={3,2,1};
int matrix[3][3];
show(dsc);
show(asc);
}

热心网友 时间:2023-10-31 20:49

/*
来自n个部队的n种*的n×n名军官,
如果能排成一个正方形,每一行,每一列的n名军官来自不同的部队并且*各不相同,
那么就称这个方阵叫正交拉丁方阵。
*/

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

/*
分配 rowSize * colSize 的二维数组空间
*/
int ** mallocTwoDimensionArray(int rowSize,int colSize)
{
int **array = (int**)malloc(sizeof(int*)*rowSize);
int i,j;
if(array == NULL)
{
return NULL;
}
else
{
for(i=0;i<rowSize;i++)
{
array[i] = (int*)malloc(sizeof(int)*colSize);
if(array[i] == NULL)
{
for(j=0;j<i;j++)
{
free(array[j]);
}
return NULL;
}
else
{
memset(array[i],0,colSize*sizeof(int));
}
}
return array;
}
}
struct LatinSquare
{
int size;
int **square;
LatinSquare * next;
};
/*
保存大小为 size * size 大小的拉丁方阵 square
到链表 head 中

返回:是否成功保存到链表中
*/
int saveLatinSquare(struct LatinSquare *head,int size,int** square)
{
struct LatinSquare *p;
int i,j;

p = (struct LatinSquare *)malloc(sizeof(struct LatinSquare));
if(p == NULL)
{
return 0;
}
else
{
// 拉丁矩阵大小
p->size = size;

p->square = mallocTwoDimensionArray(size,size);
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
p->square[i][j] = square[i][j];
}
}

// 添加构造好的拉丁矩阵到链表中
p->next = head->next;
head->next = p;

return 1;

}

}
/*
输出拉丁矩阵
*/
void printLatinSquare(struct LatinSquare *p)
{
int i,j;
if(p == NULL)
{
return ;
}
else
{
for(i=0;i<p->size;i++)
{
for(j=0;j<p->size;j++)
{
printf("%d ",p->square[i][j]);
}
printf("\n");
}
printf("\n");
}
}

/*
构造大小为 size * size 大小的拉丁方阵
构造结果通过链表 head 返回
square :当前正在构造的拉丁方阵
row :当前正在构造的拉丁方阵的行号
col :当前正在构造的拉丁方阵的列号
generatedSquareNum : 已经构造好的拉丁方阵数

返回:
能构造出的拉丁反正种数
*/
void generateLatinSquare(int size,struct LatinSquare *head,int *totalSquareNum ,int**square,int row,int col)
{
int i,j,k;
int *isNumberUsed = (int*)malloc(sizeof(int)*(size+1));

if(row == size)
{
/*
保存构造好的拉丁矩阵到结构体中。
对于构造种数比较小的拉丁矩阵适用。

构造种数比较多的,不要保存,内存会不够。
*/
saveLatinSquare(head,size,square);

/*
构造种数加一
*/
(*totalSquareNum) ++;

/*
输出构造好的拉丁矩阵到屏幕。

根据需要可以关闭这里的输出(构造种数比较少的,结果直接通过链表返回)
*/
printf("第 %d 个大小为 %d 的拉丁方阵:\n",*totalSquareNum,size);
printLatinSquare(head->next);
}
else
{
if(square == NULL)
{
square = mallocTwoDimensionArray(size,size);
}

memset(isNumberUsed,0,sizeof(int)*(size+1));

// 所在列上已经使用过的数字
for(i=0;i<row;i++)
{
isNumberUsed[square[i][col]]=1;
}
// 所在行上已经使用过的数字
for(j=0;j<col;j++)
{
isNumberUsed[square[row][j]]=1;
}

// 枚举没有被使用过的数字
for(k=1;k<=size;k++)
{
if(!isNumberUsed[k])
{
square[row][col] = k;
// 递归构造下一位上的数字
generateLatinSquare(size,head,totalSquareNum,square,row+(col+1)/size,(col+1)%size);
}
}

free(isNumberUsed);
}

}
int main(int argc, char *argv[])
{
int i,j,k;
int size,totalSquareNum;
struct LatinSquare head ,*p;
head.next = NULL;

// 构造大小从 3 ~ 10 的拉丁方阵
for(size = 3;size <=6;size ++)
{
head.next = NULL;
totalSquareNum = 0;

generateLatinSquare(size,&head,&totalSquareNum,NULL,0,0);
printf("大小为 %d 的拉丁方阵一共能构造 %d 个。\n\n",size,totalSquareNum);
/*
for(k=0,p=head.next;p!=NULL;p=p->next,k++)
{
printf("第 %d 个大小为 %d 的拉丁方阵:\n",k,size);

for(i=0;i<p->size;i++)
{
for(j=0;j<p->size;j++)
{
printf("%d ",p->square[i][j]);
}
printf("\n");
}
printf("\n");
}
*/
}
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
广东省考考哪3科 六个月宝宝缺铁吃什么好 疯狂动物园 大猩猩栖息地升级技巧 疯狂动物园怎么办boss任务 boss任务过法 疯狂动物园怎么驯服火山猩猩 疯狂动物园驯服火山猩猩 疯狂动物园火山猩猩 在陌生的城市如何辨别东南西北? 女羊男虎千万别在一起 女羊男虎婚配好不好 属羊女与属虎男婚姻能否长久 属羊女的和什么属相最配 (132-17)÷(31-18)的简便运算方法 编程角色从(-31,132)坐标出发怎么做 132-68-32的简便计算? x&#x00B2;+x-132=0 132×25-31×25-25怎么算? 132×101-132简便算法 32×132-31×32-32有简便运算吗? 木筏生存怎么联机 工程中回填土需做哪些试验 在对料场进行勘察时,需要采用一定数量的原状土样进行室内土工试验,请问需要做哪些试验项目? 我有过交通事故,我是受害人,是不是影响证信 因交通事故被法院执行,在个人征信里算不算是反罪记录? 交通事故,调节不好,上了法院。会不会进个人档案? 电动车肇事逃逸进入征信吗 交通事故没钱赔会上征信吗 怎么写过年的小诗 写一过年的小诗 怎么把淘宝删除的差评找回来 海尔冰箱 比较老了 请问一下上面一排灯都代表甚么意思 型号在图中有 谢谢! 海尔老式冰箱上的指示灯功能? 肝功能检测中, 淀粉酶132.参考值0--110 总胆汁酸22.4 参考值0-15 肌 三星note3手机给辽宁公交卡查余额可以,但是用支付宝充值和QQ充值都失败了,为什么? 国际通用轨道是标准轨,为什么俄罗斯却用宽轨呢? 国际标准轨道用英语怎么讲? ISO3834,EN15085,DIN18800,DIN4113,EN1090分别是什么标准 赛马娘丸善滑雪的cv和fate里凛是一个吗,如果不是分别是谁呢 你是如何让废旧家电变废为宝的? 请问,头孢属于抗生素药吗? 消炎药“头孢克洛分散片”属于抗生素类的药吗? windows server 2008 r2 该如何安装POP3服务器? 1、下面关于计算机中定点数与浮点数的论述,正确的是( ) A.定点数只能表示纯小数 B. 定点数只有双精度表示,没有单精度表是对的吗? 一个定点数有哪两部分组成,根据小数位置的不同,定点数有哪两种表示方法 定点表示法 阶码的定点数表示法 定点和浮点有什么区别? 怎样用定点补码表示纯小数? 定点数可以是负数吗 计算机中,如何定点表示带小数? 定点数01101001对应的纯小数和纯整数?