回溯法(2)

在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
 
这个算法和第一个差不多,每种可能都进行筛选,不过可能性更多,应该是N^(N*N)个吧。而且不能用上面那种笨办法了,循环N*N次,N都不能固定。只好按照回溯算法构造一个树出来,这个树应该是N*N层,每个父结点有N个子结点。遍历树的时候子结点是动态增加或删除的,hoho,要不然太占内存了也。
N=5的时候,实测了一下,总共有个161280拉丁方阵,在我的破T61上计算耗时7s,还过得去;N=6的时候就没耐心了. N=10的话,算了N久也没算完,总个数用64位好像都未必够,没兴趣了的说。

 

C++代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值