n阶拉丁方的计算

这个是用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;
} 
 
 
 
 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值