中易网

印度罕洛塔问题?

答案:1  悬赏:0  
解决时间 2021-04-21 08:27
将印度罕洛塔问题用计算机C语言编程,怎么解决?
最佳答案

首先把从1~n2的整数按从小到大的顺序排列成一个n×n的方阵A进行观察。(本文中所有n都是指大于1的奇数,下文中均以“A”代表这类顺序排列的n×n方阵)
以5阶阵为例:以下是A方阵
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
下边是魔方阵B:
12 16 25 4 8
6 15 19 23 2
5 9 13 17 21
24 3 7 11 20
18 22 1 10 14
先假设n阶奇次魔方阵B是存在的,从A中可以看出,B的任一元素在A中都有唯一确定的行号和列号组合(y,x)。
分离出B中所有元素在A中的行号y来构成n×n方阵I,让I(i,j)等于从B(i,j)分离出来的y;(如I(1,1) =3,即12在A中的行号A(3,2);I(1,2)=4,即16在A中的行号A(4,1)。)以下是I方阵:
3 4 5 1 2
2 3 4 5 1
1 2 3 4 5
5 1 2 3 4
4 5 1 2 3
同样分离出B中所有元素在A中的列号y来构成n×n方阵J,让J(i,j)等于从B(i,j)分离出来的x。以下是J方阵
2 1 5 4 3
1 5 4 3 2
5 4 3 2 1
4 3 2 1 5
3 2 1 5 4
观察方阵I特征为:


1.组成方阵的数为1~n的整数;


2.任一行、列均遍历1~n的所有整数;


3.主对角线上的数均为(n+1)/2,辅对角线遍历1~n的所有整数。


方阵J特征前两点同I,区别是第三点,辅对角线上的数均为(n+1)/2,主对角线遍历1~n的所有整数。 另外还有容易忽略的一点,I、J方阵对应位置上的数字组合[I(i,j),J(i,j)]是唯一的。
 综合以上的结论可以知道:B(i,j)=(I(i,j)-1)×n+J(i,j)。所以只要构造出这样两个只含1~n的数的方阵I和J,就可以确定一个n×n的魔方阵。
现在,问题就转化为怎样构造分别满足I和J的特征的两个n×n方阵。其实完成这样的算法是很简单的,可以按以下方法实现:


1) 方阵I的第一行由(n+1)/2打头,后面依次为前一个数关于n的循环后继;


2)方阵I的第i+1行由第i行循环右移得到。


本人给出的程序:


main()
{
int n,i,j;
int a[20][20],x[20][20],y[20][20];
printf("please input the number:");
scanf("%d",&n);
x[0][0]=(n+1)/2;
for(j=1;j<n;j++)
{
if(x[0][j-1]==n) x[0][j]=x[0][j-1]+1-n;
else x[0][j]=x[0][j-1]+1;
}


for(i=1;i<n;i++)
for(j=0;j<n;j++)
{
if(j-1<0) x[i][j]=x[i-1][j-1+n];
else x[i][j]=x[i-1][j-1];
}
clrscr();
printf("X:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%3d",x[i][j]);
if(j==n-1)printf("\n");
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
y[i][j]=x[i][n-1-j];
printf("Y:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("%3d",y[i][j]);
if(j==n-1)printf("\n");
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=(x[i][j]-1)*n+y[i][j];
printf("A:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("%5d",a[i][j]);
if(j==n-1)printf("\n");}


}

我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样批量修改文件名?
09年数学建模d题,求助啊,在线等
技校毕业证的编号是几位数的?在哪写着?
求灯具促销活动方案
KFC第二杯半价,请分析它的营销效果,如何应
我都16岁了个子还是1.60怎么才能再长高一点啊
问道60连环.我找杨镖头.这么不能接任务啊??
信用卡消费多少才能使用最低还款
黑潮bi-100 能配 祺祥GTX260 吗?
太姥山镇地址在哪,我要去那里办事
当阳到景洪多少公里
请问火字旁加翌是什么字?怎么读?
25岁工作如果不交养老金每月存五百年收益百分
欧通电瓶车
护理医药中专
推荐资讯
早就离司保证金没退能办理保险公司二次入司吗
陕西汉中镇巴县到四川省成都市都江堰有多远
分手后还可以做朋友麽
手上从小长了一个黑点,随着年龄越来越大,感
关于学习方面的书
怎么鉴别阴沉木
为什么我进入空间在点其它东西时 就显示内存
衣柜如何摆放才能暗合风水格局
兰州塑料六厂家属院在什么地方啊,我要过去处
如何给北京青年报投稿
镇江哪里能买到的博美?我想要
德科萨斯汉堡孟津会盟店我想知道这个在什么地
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?