永发信息网

把1到25进行排列组合,把它排成5行5列,而且每行每列以及对角线上的数之和都相等,每个数只能用一次。

答案:2  悬赏:80  手机版
解决时间 2021-02-21 18:17
用编程的方式
最佳答案
递归法,速度很慢,等会儿我会再用非递归的实现
#include
#include

int nNum[5][5];
int nStandard=0;
bool IsOK()
{//看看nNum是否满足条件
//1\选看中间是否有重复的
bool bSel[25];
int i=0,j=0,k=0;
int nSumCol,nSumLn,nStandard=0;
for(i=0;i<25;i++)
{
bSel[i]=false;
}

for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(nNum[i][j]>=1&&nNum[i][j]<=25)
{
if(!bSel[nNum[i][j]-1])
{
bSel[nNum[i][j]-1]=true;
}
else
{
return false;
}
}
else
{
printf("程序异常!");
return false;
}
}
}

//再看看每行每列之和是不是相等
for(i=0;i<5;i++)
{
nSumCol=0;
nSumLn=0;
for(j=0;j<5;j++)
{
nSumCol+=nNum[i][j];
nSumLn+=nNum[j][i];
}
if(nSumCol!=nStandard)
return false;//和标准不同
if(nSumLn!=nStandard)
return false;//和标准不同
}
//再看看对角线是否相等
nSumLn=0;
nSumCol=0;
for(i=0;i<5;i++)
{
nSumLn+=nNum[i][i];
nSumCol+=nNum[i][4-i];
}
if(nSumCol!=nStandard)
return false;//和标准不同
if(nSumLn!=nStandard)
return false;//和标准不同

return true;
}

bool IsOK(int nX)
{//先初看前nX是否满足要求
//1\选看中间是否有重复的
bool bSel[25];
int i=0,j=0,k=0;
int nSumCol;
for(i=0;i<25;i++)
{
bSel[i]=false;
}

for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(i*5+j>=nX)
{
i=5;
break;
}

if(nNum[i][j]>=1&&nNum[i][j]<=25)
{
if(!bSel[nNum[i][j]-1])
{
bSel[nNum[i][j]-1]=true;
}
else
{
return false;
}
}
else
{
printf("程序异常!");
return false;
}
}
}

//再看看每行每列之和是不是相等
for(i=0;i {
nSumCol=0;
for(j=0;j<5;j++)
{
nSumCol+=nNum[i][j];
}
if(nSumCol!=nStandard)
return false;//和标准不同
}

if(nX>21)
{
for(i=0;i {
nSumCol=0;
for(j=0;j<5;j++)
{
nSumCol+=nNum[j][i];
}
if(nSumCol!=nStandard)
return false;//和标准不同
}
}

return true;
}

void Cal(int nX)
{//递归

int i=0,j=0,k=0;
if(nX>=25)
{//出口
if(IsOK())
{
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%5d",nNum[i][j]);
}
printf("\r\n");
}
printf("\r\n");
}
return ;
}
//递归
for(k=1;k<=25;k++)
{
nNum[nX/5][nX%5]=k;
if(IsOK(nX))
Cal(nX+1);
}
}

void main()
{
//先求每行之应该是多少。
int i=0;
nStandard=0;
for(i=1;i<=25;i++)
{
nStandard+=i;
}
nStandard/=5;
Cal(0);
}
全部回答
17 24 1 8 15 23 5 7 24 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么经常被嘲笑的人将来成功率很大,这说不
有好的地质方面的书推荐吗?
下列各项因素中,对存货的经济订货量没有影响
二本最容易考的师范学校
在配置10%的氯化钠溶液的过程中,会导致溶液
贵州省生产力促进中心(旧)地址在哪,我要去那
中国·名典地址在哪,我要去那里办事
为什么我的手机上网发信息字多了发不出去
【北风乍起时阅读短文的答案】五年级阅读练习
杨杭小学这个地址在什么地方,我要处理点事
图示(1)、(2)两截面,其惯性矩关系应为:A.B.
净水器如何换滤芯
补修和维修有什么区别
仙剑奇侠传5前传还有没有DLC,官方一共出几个
(1):2x-3<x+1/3
推荐资讯
沈阳鼎鑫汽车贸易中心我想知道这个在什么地方
农商银行怎么开网银
花山区文化馆老年活动中心地址有知道的么?有
武夷交通运输股份有限公司建阳分公司工会委员
望京花园东区西门(人行门)地址在什么地方,想
广东工贸职业技术学院一个校区多大?!
求助,增压泵漏水怎么回事
黑龙江省工商银行黑龙江分行在哪
宝马523油耗大概是多少?市区油耗
滨州黎明广告有限公司这个地址在什么地方,我
睿思道/新家园路(路口)我想知道这个在什么地
【中书舍人】唐宋时候中书舍人的官是几品?我
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?