| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1900 人关注过本帖
标题:十九格填数问题
只看楼主 加入收藏
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
晚安

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-05-08 00:11
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 

修复了一点错误 :
3 17 18
19 7 1 11
16 2 5 6 9
12 4 8 14
10 13 15
#include "stdio.h"
#define HE 38
int k[19]={0}, s[5][9]={0}; //k[]代表1-19有没有被占用
int test(int a) //从第三行开始就要检查斜行是否符合38
{
int i, j, sum1=0, sum2=0, sum3=0, ia, ja, hs=a;
for(i=a-2, j=10-a; a > -1 && s[a][i]; a--) //(a-2)此题中2是中间一行 (10-a)最右边数的位置
{
sum1 += s[a][i++];
sum2 += s[a][j--];
}
if((hs==4) && (sum2==HE) && (sum1==HE)) //到最后一行且最后一行包含2个以上的数字
{
i = hs - 2;
j = 10 - hs;
sum2 = 0;
for(a = hs; i > -1; a--) //即到中间一行 此循环计算- - 这两边的和
{ // - -
sum2 += s[a][i--]; // - -
sum3 += s[a][j++];//
}
if((sum2 != HE) || (sum3 != HE))
sum2 = 0;
else
for(i = hs; i < (10-hs); i += 2)
{
sum2 = 0;
sum3 = 0;
ja = ia = i;
for(a = hs; s[a][ia]>0 || s[a][ja]>0; a--)
{
if(s[a][ia] > 0)
sum2 += s[a][ia++];
if(s[a][ja] > 0)
sum3 += s[a][ja--];
}
if((sum2 != HE) || (sum3 != HE))
{
sum2 = 0;
break;
}
}
}
if(sum1 == HE)
{
if(sum2 == HE)
return 1; //是1表示成功
else
return 2; //返回2表示左斜边是38
}
else
return 0; //0表示不成功
}

int js(int a, int b, int sum) //a行坐标 b列坐标 sun表示进入此前的行各数之和
{
int i = 0, n, m = 0; //
while(m != 1) //m表示本次找的数不行再找另一个
{
while(k[i] == 1) //找到没被用过的数字
{
if(i > 17)
return 0;
else
i++;
}
n = i + sum + 1;
if(n > HE)
return 0; //返回0表示此行组的数不符合
else
{
k[i] = 1; //如果找到的数符合就做上标记表示被用
s[a][b] = i + 1;
}
if(a==0 || a==4) //
{
if(b < 6)
{
if(b==4 && n>18)
m = js(a, b+2, n);
else if(b==2 && n>2)
m = js(a, b+2, n);
}
else
{
if(a == 0)
{
if(n == HE)
m = js(a+1, 1, 0);
}
else
{
if(n == HE)
m = test(4); //最终检查
}
}
}
else if(a==1 || a==3)
{
if(b < 7)
{
if(a == 3 && b == 1) //判断左斜边是否38
{
if(test(3)==2)
m = js(a, b+2, n);
}
else
m = js(a, b+2, n);
}
else
{
if(a == 1)
{
if(n == HE)
m = js(a+1, 0, 0);
}
else
{
if(n == HE)
{
if(test(3) == 1)
m = js(a+1, 2, 0);
}
}
}
}
else //当到中间一行,第三行,a=2 b=0
{
if(b < 8)
{
if(0 == b) //判断左斜边是否38
{
if(test(2) == 2)
m = js(2, 2, 0);
}
else
{
m = js(2, b+2, n);
}
}
else
{
if(n = HE)
if(test(2) == 1)
m = js(3, 1, 0);
}
}
if(m != 1) //函数返回0表示下一个数没找到,此数需要重新找
{
k[i] = 0;
if(i < 18)
i++;
else
return 0;
}
}
return m;
}
int main()
{
int i, j, n, m, temp;
temp = js(0, 2, 0);
if(temp == 1)
printf("ok\n");
else
printf("flase\n");
for(i = 0; i < 5; i++)
{
if((i==0 || i==4))
{
j = 2;
m = 7;
printf(" ");
}
else if((i==1 || i==3))
{
j = 1;
m = 8;
printf(" ");
}
else
{
j = 0;
m = 9;
}
for(n=j; n<m; n+=2)
{
if(s[i][n] > 9)
printf("%d ", s[i][n]);
else
printf(" %d ", s[i][n]);
}
printf("\n");
}
return 0;
}

[此贴子已经被作者于2007-5-9 3:42:02编辑过]


英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-05-08 01:41
love52657
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2007-5-4
收藏
得分:0 
大侠~好崇拜啊~~~~

我 为 C 狂
2007-05-08 14:07
yihai0494
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-5-5
收藏
得分:0 
回复:(iwfy)修复了一点错误,头一次没考虑最后一行...

你真的太厉害了,谢谢,谢谢
向你学习


天行健,君子以自强不息!
2007-05-12 10:50
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
22楼比上面的能完善些

我写的太长了,能力有限,代码没优化

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-05-12 10:58
liyuewen
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2007-5-7
收藏
得分:0 
如果不使用#define N 38怎么设计,谢谢
2007-05-12 18:11
yihai0494
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-5-5
收藏
得分:0 
回复:(yihai0494)十九格填数问题

对了,这个问题叫六角幻方问题。彼时不知道,不好意思哦。


天行健,君子以自强不息!
2007-08-02 21:38
czl
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-7-1
收藏
得分:0 

外面12个数很好找得 也很容易排列出来 

2007-08-03 09:21
xu66zhen
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-7-23
收藏
得分:0 

真是厉害啊!敬佩...你的毅力


2007-08-03 10:56
totohack
Rank: 1
等 级:新手上路
帖 子:133
专家分:0
注 册:2007-7-15
收藏
得分:0 
佩服写代码的勇气

2007-08-03 13:31
快速回复:十九格填数问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038185 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved