一个N*N的矩阵,任何一个元素在同一行或同一列都只出现一次:
1 2 3
2 3 1
3 1 2
解法
每一行除了开始的数递进一位外,其余的数都是按照顺序排列,递进的数排在后面,因此使用循环链表解决。
1.创建循环列表
typedef struct Node {
int data;
struct Node *next;
}LinkList;
#define LINKLIST
#include "LatinSquare.h"
LinkList *create(int n) {
LinkList *currentNode = NULL;
LinkList *firstNode = NULL;
for (int i=1; i<=n; i++) {
LinkList *node = (LinkList*)malloc(sizeof(LinkList));
node->data = i;
node->next = NULL;
if (currentNode != NULL) {
currentNode->next = node;
}
currentNode = node;
if (i == 1) {
firstNode = currentNode;
}
}
currentNode->next = firstNode;
return firstNode;
}
2.创建拉丁方阵
void createLatinSquare(LinkList* list) {
LinkList *currentNode = list;
do {
LinkList *innerNode = currentNode;
do {
printf("%d ",innerNode->data);
innerNode = innerNode->next;
} while (innerNode != currentNode);
printf("\n");
currentNode = currentNode->next;
} while (currentNode != list);
}
结果
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
网友评论