简单的算法,搞定马上结分!!!!

xcz1943 2005-11-26 07:34:31
题目:
五位跳水高手将参加十米高台跳水决赛,有好事者让五个人根据实力预测比赛结果。
A选手说;B第二,我第三
B选手说 我第二,E第四
C选手说 我第一,D第而
D选手说 c最后,我第三
e选手说 我第四,A第一
决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请写出分析过程 并编程出比赛的实际名次
提示 将五个人的预测写成逻辑表达方式
写个代码下来,谢谢!
...全文
727 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
manplus 2005-11-29
  • 打赏
  • 举报
回复
mark
bestlife 2005-11-29
  • 打赏
  • 举报
回复
我没看懂,脑袋还晕了!
zhouxiangsen 2005-11-28
  • 打赏
  • 举报
回复
厉害,看来离散数学也不能丢啊!
对吗?
bekars 2005-11-28
  • 打赏
  • 举报
回复
Mark
夏天的大蝎子 2005-11-28
  • 打赏
  • 举报
回复
liweiswin 2005-11-28
  • 打赏
  • 举报
回复
这么多高手。小弟见识了。谢谢各位!!!!
NKNM 2005-11-28
  • 打赏
  • 举报
回复
main()
{
int a,b,c,d,e;
for(a=1; a<=5; a++)
for(b=1; b<=5; b++)
for(c=1; c<=5; c++)
for(d=1; d<=5; d++)
for(e=1; e<=5; e++)
{
if(((b==2||a==3)==1)&&((b==2&&a==3)!=1))
{
if(((b==2||e==4)==1)&&((b==2&&e==4)!=1))
{
if(((c==1||d==2)==1)&&((c==1&&d==2)!=1))
{
if(((c==5||d==3)==1)&&((c==5&&d==3)!=1))
{
if(((e==4||a==1)==1)&&((e==4&&a==1)!=1))
{
if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)
printf("%d--%d--%d--%d--%d\n",a,b,c,d,e);
}
}
}
}
}
}
}
flyskywz 2005-11-28
  • 打赏
  • 举报
回复
没看懂,就是一个字,牛!!
wotur 2005-11-28
  • 打赏
  • 举报
回复
强人阿,佩服
nipcdll 2005-11-28
  • 打赏
  • 举报
回复
佩服
tin1908 2005-11-27
  • 打赏
  • 举报
回复
帮我把今天的题目也搞定一下拉!!
tin1908 2005-11-27
  • 打赏
  • 举报
回复
shishaguo(江大沙锅)我放进去怎么运行不了啊??
iostream.h在里面好象显示什么不允许啊?
blufo 2005-11-27
  • 打赏
  • 举报
回复
代码就不写了。 我比较喜欢shishaguo(江大沙锅)所写 。
guogang9527 2005-11-27
  • 打赏
  • 举报
回复
真是牛啊,实在是佩服啊。。xiaocai0001(萧筱雨) I 服 U 咯
aimt 2005-11-27
  • 打赏
  • 举报
回复
长见识了,xiaocai0001(萧筱雨) 真牛!!
xiaocai0001 2005-11-27
  • 打赏
  • 举报
回复
程序实现上述推导.
运行结果(TC, VC下调试通过):

0x36
D -- 2nd
A -- 3rd
E -- 4th
C -- 5th
Press any key to continue

------------------------------

#include <stdio.h>

typedef union PropSet
{
struct
{
unsigned int p1:1;
unsigned int p2:1;
unsigned int p3:1;
unsigned int p4:1;
unsigned int p5:1;
unsigned int p6:1;
unsigned int p7:1;
unsigned int p8:1;
}prop;
#define p1 prop.p1
#define p2 prop.p2
#define p3 prop.p3
#define p4 prop.p4
#define p5 prop.p5
#define p6 prop.p6
#define p7 prop.p7
#define p8 prop.p8
unsigned short val;
}Propositions;

int Judge(Propositions p);
void Show(Propositions p);

int main()
{
Propositions p;
for(p.val=0; p.val<=255; ++p.val)
{
if(Judge(p))
Show(p);
}
return 0;
}

int Judge(Propositions p)
{
/* // p1: B 第二
// p2: A 第三
// p3: E 第四
// p4: C 第一
// p5: D 第二
// p6: C 第五
// p7: D 第三
// p8: A 第一
// A说对了一半: p1(!p2)∨(!p1)p2 ......①
*/ if((p.p1^p.p2) == 0)
return 0;
/* // B说对了一半: p1(!p3)∨(!p1)p3 ......②
*/ if((p.p1^p.p3) == 0)
return 0;
/* // C说对了一半: p4(!p5)∨(!p4)p5 ......③
*/ if((p.p4^p.p5) == 0)
return 0;
/* // D说对了一半: p6(!p7)∨(!p6)p7 ......④
*/ if((p.p6^p.p7) == 0)
return 0;
/* // E说对了一半: p3(!p8)∨(!p3)p8 ......⑤
*/ if((p.p3^p.p8) == 0)
return 0;
/* // A名次不能同时为第三和第一
*/ if(p.p2 && p.p8)
return 0;
/* // D名次不能同时为第二和第三
*/ if(p.p5 && p.p7)
return 0;
/* // C名次不能同时为第一和第五
*/ if(p.p4 && p.p6)
return 0;
/* // A, C不能同时第一名
*/ if(p.p4 && p.p8)
return 0;
/* // B, D不能同时第二名
*/ if(p.p1 && p.p5)
return 0;
/* // A, D不能同时第三名
*/ if(p.p2 && p.p7)
return 0;

return 1;
}

void Show(Propositions p)
{
printf("0x%X\n", p.val);
if(p.p4)
puts("C -- 1st");
if(p.p8)
puts("A -- 1st");
if(p.p1)
puts("B -- 2nd");
if(p.p5)
puts("D -- 2nd");
if(p.p2)
puts("A -- 3rd");
if(p.p7)
puts("D -- 3rd");
if(p.p3)
puts("E -- 4th");
if(p.p6)
puts("C -- 5th");
return;
}
xiaocai0001 2005-11-27
  • 打赏
  • 举报
回复
标记如下原子命题:
p1: B 第二
p2: A 第三
p3: E 第四
p4: C 第一
p5: D 第二
p6: C 第五
p7: D 第三
p8: A 第一

符号说明:
!: 逻辑否运算, ∧: 逻辑与运算, ∨: 逻辑或运算

(Ⅰ)由各个人只说对了一半可得如下约束条件:
A说对了一半: (p1∧!p2)∨(!p1∧p2)
简记为: p1(!p2)∨(!p1)p2 ......① (下同)
B说对了一半: p1(!p3)∨(!p1)p3 ......②
C说对了一半: p4(!p5)∨(!p4)p5 ......③
D说对了一半: p6(!p7)∨(!p6)p7 ......④
E说对了一半: p3(!p8)∨(!p3)p8 ......⑤

(Ⅱ)同一名次不能有两个人, 得如下约束条件:
p4与p8不能同时成立, 得: !p4∨!p8 ......⑥
p1与p5不能同时成立, 得: !p1∨!p5 ......⑦
p2与p7不能同时成立, 得: !p2∨!p7 ......⑧

(Ⅲ)同一个人不能有两个名次, 得如下约束条件:
p2与p8不能同时成立, 得: !p2∨!p8 ......⑨
p4与p6不能同时成立, 得: !p4∨!p6 ......⑩
p5与p7不能同时成立, 得: !p5∨!p7 ......⑾

最后的答案需要满足如下的命题:
①∧②∧③∧④∧⑤∧⑥∧⑦∧⑧∧⑨∧⑩∧⑾
将上式化为析取范式, 即可得到命题的约束条件的最简形式.
由①∧②得(根据与运算的分配律):
p1(!p2)(!p3)∨(!p1)p2p3 ......⑿

同理对其他表达式进行合并运算
......

最后得到如下结果:
(!p1)(p2)(p3)(!p4)(p5)(p6)(!p7)(!p8)
即: 2,3,5,6原子命题为真, 1,4,7,8为假
p2: A 第三
p3: E 第四
p5: D 第二
p6: C 第五
为真
可以推出比赛结果的名次排列如下:
①B ②D ③A ④E ⑤C
Mr_Yang 2005-11-27
  • 打赏
  • 举报
回复
学习。
deuso 2005-11-27
  • 打赏
  • 举报
回复
上面江大沙锅的程序部分应该加一个括号改成
A1=((B==2||A==3)&&!(B==2&&A==3));
B1=((B==2||E==4)&&!(B==2&&E==4));
C1=((C==1||D==2)&&!(C==1&&D==2));
D1=((C==5||D==3)&&!(C==5&&D==3));
E1=((E==4||A==1)&&!(E==4&&A==1));
就对了
liusdream 2005-11-26
  • 打赏
  • 举报
回复
刚学C,试着写了一个,不对的地方请高手们指点一下:
#include <stdio.h>
void main ( void )
{
int iFori=3125,iA=0,iB=0,iC=0,iD=0,iE=0;

printf("\tA\tB\tC\tD\tE\n");
for (iFori=1;iFori<3126;iFori++)
{
iA=iFori%5;
iB=(iFori/5)%5;
iC=((iFori/5)/5)%5;
iD=(((iFori/5)/5)/5)%5;
iE=((((iFori/5)/5)/5)/5)%5;
if ((1==((2==iB)+(3==iA))) &&
(1==((2==iB)+(4==iC))) &&
(1==((1==iC)+(2==iD))) &&
(1==((0==iC)+(3==iD))) &&
(1==((4==iE)+(1==iD))) &&
(iA!=iB) && (iA!=iC) && (iA!=iD) && (iA!=iE) &&
(iB!=iC) && (iB!=iD) && (iB!=iE) &&
(iC!=iD) && (iC!=iE) &&
(iD!=iE))
{
printf("\t%d\t%d\t%d\t%d\t%d\n",
iA+5>5?iA:iA+5,iB+5>5?iB:iB+5,iC+5>5?iC:iC+5,iD+5>5?iD:iD+5,iE+5>5?iE:iE+5);
}//end if
}//end for
return;
}
加载更多回复(4)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧