把1到25进行排列组合,把它排成5行5列,而且每行每列以及对角线上的数之和都相等,每个数只能用一次。
答案:2 悬赏:80 手机版
解决时间 2021-02-21 18:17
- 提问者网友:原来太熟悉了会陌生
- 2021-02-21 05:36
用编程的方式
最佳答案
- 五星知识达人网友:十年萤火照君眠
- 2021-02-21 06:32
递归法,速度很慢,等会儿我会再用非递归的实现
#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);
}
#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);
}
全部回答
- 1楼网友:十鸦
- 2021-02-21 07:21
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯