拉丁方阵(英语:Latin square)是一种 n × n 的
方阵,在这种 n × n 的方阵里,恰有 n 种不同的
元素,每一种不同的元素在同一行或同一列里只出现一次
eg:
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
代码:
代码运行结果:
eg:
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
代码:
#include <stdio.h> #include <malloc.h> typedef struct node{ int id; struct node * next; }Node, *LinkList; void addNode(LinkList * linkList,int id); void traverse(LinkList * linkList,void (*pfun)(int)); void initLinkList(LinkList * linkList); void pfun(int data); int main(void) { LinkList linkList; initLinkList(&linkList); int n; printf("请输入一个数(1-9):"); scanf("%d",&n); while(getchar()!='\n') continue; int i; for(i=n;i>0;i--)//生成n个节点 addNode(&linkList,i); Node *pn,*temp; temp = pn = linkList->next; while(temp != linkList) { do{ printf(" %d",pn->id); if(pn->next == linkList) pn = pn->next->next; else pn = pn->next; }while(temp != pn); printf("\n"); temp = temp->next; pn = temp; } return 0; } void pfun(int data) { printf(" %d",data); } void initLinkList(LinkList * linkList) { (*linkList) = (Node *)malloc(sizeof(Node)); (*linkList)->next = *linkList; } //头插法添加元素 void addNode(LinkList * linkList,int id) { Node * pn = (Node *)malloc(sizeof(Node)); pn->id = id; if(!(*linkList)->next) { pn->next = *linkList; }else{ pn->next = (*linkList)->next; } (*linkList)->next = pn; } void traverse(LinkList * linkList,void (*pfun)(int)) { Node * pn = (*linkList); while(pn->next != *linkList) { pfun(pn->next->id); pn = pn->next; } }
代码运行结果: