美文网首页
拉丁方阵问题

拉丁方阵问题

作者: 9a957efaf40a | 来源:发表于2018-12-25 18:41 被阅读10次

    一个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
    

    相关文章

      网友评论

          本文标题:拉丁方阵问题

          本文链接:https://www.haomeiwen.com/subject/nycqlqtx.html