拉丁方阵问题介绍

拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中 恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名。例如下面是一个3×3的拉丁方阵:

1 2 3

2 3 1

3 1 2

拉丁方阵问题分析

矩阵的第一行是 1 2 3 从第一个元素开始到最后一个元素。

矩阵的第二行是 2 3 1 从第二个元素开始到 循环1圈的最后一个元素。

矩阵的第三行是 1 2 3 从第三个元素开始到 循环1圈的最后一个元素。

不难找出规律:矩阵的第n行,元素是从第n个元素 循环遍历完一圈的数据

那我们自己推导2  5  8  10的拉丁方阵是

2 5 8 10

5 8 10 2

8 10 2 5

10 2 5 8

符合拉丁方阵的要求吧。

从代码角度来实现,主要思路如下

1、用循环链表来接受n个不同的数据。

2、矩阵第i行数据,是从循环链表的第i个位置的数据遍历完整个循环链表 将其数据取出。


拉丁方阵代码展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define OK 1
#define ERROR 0typedef struct Node
{int data;struct Node* next;
} Node, *LinkList;
/*
创建循环链表
*/
int CreatCircleList(Node** circle_list,int n)
{printf("请输入%d个不同的数字:",n);int i = 0;//创建头结点Node* head = (Node*)malloc(sizeof(Node));Node* temp = head;//temp 移动指针,刚开始指向头结点while (i < n){int data=0;scanf("%d",&data);//创建结点并初始化数据Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;//将结点添加到循环链表中temp->next = node;temp = node;i++;}//循环结束 temp指向最后一个结点,让其指向第一个结点,形参循环列表temp->next = head->next;//循环链表指向第一个结点*circle_list = head->next;//释放头结点free(head);return OK;}
//获取循环链表长度
int LengthCircleList(Node* circle_list)
{if (circle_list == NULL){return 0;}int i = 1;Node* node = circle_list;//node为移动指针,node 开始指向循环链表第一个结点//循环链表遍历完判断,尾结点的指针域指向第一个结点while (node->next != circle_list){node = node->next;i++;}return i;
}
/*
显示拉丁方阵
*/
int ShowLatin(Node* latin_list)
{int len = LengthCircleList(latin_list);Node* first = latin_list;for (size_t i = 0; i < len; i++){Node* node = first;int j = 0;/*找到开始结点第一行 开始结点为 循环链表第1个位置结点第二行 开始结点为 循环链表第2个位置结点第N 行 开始结点为 循环链表第n个位置结点*/while(j < i){node = node->next;j++;}Node * begin = node;int k = 0;//遍历完这个循环列表while(k<len){printf("%d\t",begin->data); begin = begin->next;k++;}printf("\n");}return OK;
}
//销毁链表释放内存
int DestroyCricleList(Node* circle_list)
{if (circle_list == NULL){return ERROR;}Node* node = circle_list;//node为移动指针,node 开始指向循环链表第一个结点//循环链表遍历完判断,尾结点的指针域指向第一个结点while (node->next!= circle_list){Node* temp = node;node = node->next;free(temp);}//释放最后一个结点free(node);return OK;
}int main(int argc, char *argv[])
{Node* circle_list = NULL;while (1){printf("请输入拉丁方阵的阶数(0退出):");int n = 0;scanf("%d", &n);if (n == 0){break;}CreatCircleList(&circle_list,n);ShowLatin(circle_list);DestroyCricleList(circle_list);}circle_list = NULL;return 0;
}

拉丁方阵结果展示

循环链表:拉丁方阵问题相关推荐

  1. C循环链表拉丁方阵问题

    输入n阶 拉丁方阵, 输入第一行的元素,自动算出其他(n-1)行的元素代码很简单 用一个循环链表解决 #include <stdio.h> #include <stdlib.h> ...

  2. 循环链表解决拉丁方阵问题

    拉丁方阵是一种N*N的方阵,方阵中恰巧 有N种不同的元素,每种元素恰好有N个,并且每种元素在一行和一列中恰好出现一次,例如这下面这个图片就是一个3X3的拉丁方阵 这个实在太简单了-操作只要两步 创建循 ...

  3. 利用循环链表实现拉丁方阵问题

    拉丁方阵   拉丁方阵是一种 n × n 的方阵,   在这种 n x n 的方阵里,有 n 种不同的元素,每一种不同的元素在同一行或同一列里只出现一次. 实现原理   通过生成的拉丁方阵,观察横排元 ...

  4. 循环链表解决拉丁方阵问题 数据结构 C/C++

    循环链表解决拉丁方阵问题 1.拉丁方阵 2.问题描述 3.main函数 4.打印拉丁方阵代码 5.循环链表基本操作实现 1.拉丁方阵 拉丁方阵(英语:Latin square)是一种 n × n 的方 ...

  5. 循环链表实现约瑟夫问题,拉丁方阵问题

    关于约瑟夫以及拉丁方阵的问题在这里就不进行描述了,详见百度就行了,下面直接上代码 链表节点的定义 struct Node{int data;Node *next; } 初始化该循环链表 Node* i ...

  6. 线性表15|魔术师发牌问题和拉丁方阵 - 数据结构和算法20

    线性表15 : 魔术师发牌问题和拉丁方阵 让编程改变世界 Change the world by program 题外话 今天小甲鱼看到到微博有朋友在问,这个<数据结构和算法>系列课程有木 ...

  7. c语言解决拉丁方阵问题

    拉丁方阵是一种 n × n 的方阵,在这种 n × n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同一列里只出现一次. #include<stdio.h> #includ ...

  8. 算法之美--4.3.5 拉丁方阵问题

    拉丁方阵问题 问题描写叙述: 拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,而且每种元素在一行和一列中 恰好出现一次. 著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元 ...

  9. 魔术师发牌问题和拉丁方阵问题

    本节引言: 本节继续带来的是循环链表的两个经典例子,分别是魔术师发牌问题和拉丁方阵问题! 1.魔术师发牌问题 问题描述: 魔术师利用一副牌中的13张黑桃牌,预先将他们排好后叠放在一起,牌面朝下.对观众 ...

最新文章

  1. Django集成Markdown编辑器【附源码】
  2. 简述css属性选择器的几种定义方式_CSS 属性选择器详解
  3. orcad如何设置模块化设计_充气膜结构送风设置设计以及通风效果如何呢?
  4. 在oracle中如何复制用户的权限不够,linux 普通用户下 移动或复制一个zip文件权限不够怎么办...
  5. [转]Mogre 环境配置问题(Exception from HRESULT: 0x800736B1)
  6. python request下载文件_Python3.4.3使用urllib.request下载文件带进度显示
  7. Spring Boot 2.0 开源项目--云收藏。收藏你所喜欢的一切。
  8. git解决冲突 删除本地_Git冲突:git pull时和本地改动冲突
  9. VS2019调试查看变量_机器人调试(六十六)
  10. 机器学习笔记(三十一):集成学习
  11. OMP与MP算法流程与代码
  12. WPS或Excel将姓名变为拼音
  13. python 爬虫框架scrapy优势_开源爬虫框架各有什么优缺点
  14. 互联网舆情监测控免费及系统技术方法详解
  15. 电脑变慢,电脑突然变慢怎么办 电脑卡死原因和解决方法
  16. SQL server 插入日期处理
  17. MTK VILTE预研文档
  18. Body-parser
  19. 将mp4文件转换为flv
  20. Java基础—集合框架(三)

热门文章

  1. 简单英文题 24 Divisor and Multiple(python)
  2. 1.2编程基础之变量定义、赋值及转换 10 Hello, World 的大小
  3. 1.3编程基础之算术表达式与顺序执行 03 计算(a+b) c的值
  4. 14怎么敷铜不了_YEO护肤课堂:敷面膜有什么误区?我们应该如何选择面膜?
  5. Vue第一部分(4):表单的双向数据绑定:v-model指令
  6. Qt文档阅读笔记-Broadcast Receiver Example解析
  7. C++笔记-DLL的编写与调用
  8. QML笔记-QML基本数据类型的使用
  9. Qt文档阅读笔记-编写应用脚本解析与实例
  10. 7.2图的存储结构(邻接表)