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

xcz1943 2005-11-26 07:34:31
题目:
五位跳水高手将参加十米高台跳水决赛,有好事者让五个人根据实力预测比赛结果。
A选手说;B第二,我第三
B选手说 我第二,E第四
C选手说 我第一,D第而
D选手说 c最后,我第三
e选手说 我第四,A第一
决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错,请写出分析过程 并编程出比赛的实际名次
提示 将五个人的预测写成逻辑表达方式
写个代码下来,谢谢!
...全文
734 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

70,021

社区成员

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

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