拉丁方阵问题

2018-12-25  本文已影响10人  9a957efaf40a

一个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
上一篇 下一篇

猜你喜欢

热点阅读