拉丁方阵问题

*问题分析与算法设计

  构造拉丁方阵的方法很多,这里给出最简单的一种方法。观察给出的例子,可以发现:若将每 一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到N顺序构成;对于第i行,这个环的开始数字为i。按照 此规律可以很容易的写出程序。下面给出构造6阶拉丁方阵的程序。

编程技巧:环形输出数字:t = (i + j) % n

代码如下:

#include<stdio.h>
int main() {
    int n,i,j,k,t;
    scanf("%d",&n);
    for(j=0;j<n;j++){
        for(i=0;i<n;i++){
            t = (i+j)%n;
            for(k=0;k<n;k++){
                printf("%d",(k+t)%n+1);
            }
            printf("
");
        }
        printf("
");
    }
    return 0;
}

方法二、使用循环链表来实现,代码如下:

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

typedef struct node {
    int data;
    struct node *next;
}sqlist,*linklist;

// 创建链表
linklist CreateLinkList(int CardNumber) {
    linklist head = NULL;
    linklist s,r;
    int i;
    r = head;
    for(i=1;i<=CardNumber;i++) {
        s = (linklist)malloc(sizeof(sqlist));
        s->data = i;
        if(head==NULL){
            head = s;
        }else {
            r->next = s;
        }
        r = s;
    }
    r->next = head;
    return head;
}
int main()
{
    linklist p;
    int n,i,j;
    printf("请输入方阵的规模:");
    scanf("%d",&n);
    p = CreateLinkList(n);
    i = n;
    while(i--){
        j = n;
        while(j--){
            printf("%d ",p->data);
            p = p->next;
        }
        printf("
");
        p = p->next;
    }
    printf("
");
    return 0;
}
原文地址:https://www.cnblogs.com/ncuhwxiong/p/6934111.html