*问题分析与算法设计
构造拉丁方阵的方法很多,这里给出最简单的一种方法。观察给出的例子,可以发现:若将每 一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由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; }