题目如下:
在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅 出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。 编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。
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
#include <stdio.h>
#define maxorder 5
int array[maxorder][maxorder]; //定义最大阶数为5阶方阵
int count,num; //定义全局计数变量num
int make(int x,int y,int N);
int judge(int x,int y);
void print();
int make(int x,int y,int N) //产生每个矩阵并计数
{
if(count==N*N)
{
print(N); //如果数字产生完毕,输出矩阵,并计入计数器
num++;
}
else
{
for(int 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; //递归完毕重新生成矩阵
}
}
}
int judge(int x,int y) //检查元素是否在一行或一列中重复出现,是返回0,否返回1
{
int i;
int judgenum=array[x][y];
for( i=0;i <y;i++)
if(judgenum==array[x][i]) return 0;
for(i=0;i <x;i++)
if(judgenum==array[i][y]) return 0;
return 1;
}
void print(int N) //打印矩阵
{
for(int i=0;i <N;i++){
for(int j=0;j <N;j++)
printf( "%2d ",array[i][j]);
printf( "\n ");
}
printf( "\n ");
}
int main(){ //主函数
int N;
printf( "请输入矩阵的阶数: ");
scanf( "%d",&N);
printf( "\n ");
make(0,0,N);
printf( "%d阶拉丁方阵有%d个\n ",N,num);
return 0;
}