拉丁方阵个数统计!

loongee 2007-05-13 09:52:37
今天在一篇入门题上看到了下面这个题目,看了N久都没想出答案,GOOGLE了一下,结果除了找到一篇看不懂的之外,其余人都没做出来,所以在此向各位达人们求教。
题目如下:

在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
请注意最后要输出所有方阵而且要统计个数。
...全文
833 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2007-05-14
  • 打赏
  • 举报
回复
关注!收藏!
banzhiyu 2007-05-14
  • 打赏
  • 举报
回复
和楼主共同思考,感觉有些难度。有想法再贴出来吧。
expter 2007-05-14
  • 打赏
  • 举报
回复
方法多哦

可以横看,可以竖看 都可以
呵呵
loongee 2007-05-14
  • 打赏
  • 举报
回复
嗯!居然没想到百度空间。看来下次得多用几个搜索工具试试了。多谢LS提醒。
CHROX 2007-05-14
  • 打赏
  • 举报
回复
还发现了一个有意思的问题,lz为什么搜不出来?因为这是百度空间里的东西,用google肯定不给你显示了,呵呵。再次发现google也不是多么公正啊,都是利益的事儿,无可厚非。
CHROX 2007-05-14
  • 打赏
  • 举报
回复
Latin squares
n L(n)
1 1
2 2
3 12
4 576
5 161280
6 812851200
7 61479419904000
8 108776032459082956800
9 5524751496156892842531225600
10 9982437658213039871725064756920320000
11 776966836171770144107444346734230682311065600000
//已验证算法n=1,2,3,4,5,6时符合。超过6后int溢出,验证6时建议注释掉make函数
//中的print();否则你将无法忍受几个小时的等待
//代码引用自:http://hi.baidu.com/wxw12345/blog/item/7a7585cb0377cdfc53664f38.html
#include <stdio.h>
#include <iostream>

#define ok 1
#define no 0

int array[10][10],N,count=0,result_num=0;

bool check(int x,int y);
void make(int x,int y);
void print();

int main(){
printf("请输入矩阵的阶数:");
scanf("%d",&N);
make(0,0);
printf("一共有%d个%d阶拉丁方阵!\n",result_num,N);
system("pause");
}

bool check(int x,int y){
int i;
int checknum=array[x][y];
for( i=0;i<y;i++)
if(checknum==array[x][i]) return no;
for(i=0;i<x;i++)
if(checknum==array[i][y]) return no;
return ok;
}
void make(int x,int y){
if(count==N*N){
print();
result_num++;
}
else{
for(int i=1;i<=N;++i){
array[x][y]=i;
count++;
if(check(x,y)){
int yy=(y+1)%N;
int xx=x;
if(y==N-1) xx=x+1;
make(xx,yy);
}
--count;
}
}
}

void print(){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
printf("%2d",array[i][j]);
printf("\n");
}
printf("\n");
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧