这个是用c语言写的求解n阶拉丁方的方法
#include <stdio.h>
static int array[5][5];//定义最大阶数为5阶方阵
static int num;//定义全局计数变量num
static int count=0;//定义每个矩阵已经填好数字的个数
//产生每个矩阵并计数
int make(int x,int y,int N) {
int i;
if(count==N*N){
//如果数字产生完毕,输出矩阵,并计入计数器
put(N);
num++;
} else{
for(i=1;i<=N;i++){
//产生矩阵数字
array[x][y]=i;
count++;
if(judge(x,y)){
int yy=(y+1)%N;
int xx=x;
if(y==N-1) {
xx=x+1;
}
make(xx,yy,N);
}
//递归完毕重新生成矩阵
--count;
}
}
}
//检查元素是否在一行或一列中重复出现,是返回0,否返回1
int judge(int x,int y){
int i;
int result=1;
int judgenum=array[x][y];
//检查同一行中有没有相同的元素
for( i=0 ; i<y ; i++) {
if(judgenum==array[x][i]){
result=0;
}
}
//检查同一列中有没有相同的元素
for(i=0 ; i<x ; i++) {
if(judgenum==array[i][y]){
result=0;
}
}
return result;
}
//打印矩阵
void put(int N)
{
int i,j;
for(i=0;i <N;i++){
for(j=0;j <N;j++) {
printf(" %2d",array[i][j]);
}
printf( "\n");
}
for (i=0 ; i<N*4 ;i++){
printf("*");
}
printf("\n");
}
int main(){
int N;
printf( "请输入矩阵的阶数: ");
scanf( "%d",&N);
printf( "-----------------\n");
make(0,0,N);
printf( "%d阶拉丁方阵有%d个\n",N,num);
return 0;
}