【C语言】输出N阶拉丁方阵并统计个数

题目如下:

在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;
} 




    原文作者:拉丁方阵问题
    原文地址: https://blog.csdn.net/honkerjha/article/details/78555371
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞