您的位置:首页 > 编程语言 > C语言/C++

小解C语言智力问题

2016-08-04 09:41 295 查看

  五位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第一,我第三,B选手说:我第二,E第四,C选手说:我第一,D第二,D选手说:C最后我第三,E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请你猜测比赛的名次

   看到这道问题当然开始的想法就是列举法,将每种情况都列举一遍,最终满足题意要求的就是正确的比赛结果,那仫如何编程实现呢?既然是穷举法用程序实现就是五个for循环,将每种情况穷举一遍满足题意的就是结果,那仫我开始实现的版本就是:
   
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int main()
{
int a=0,b=0,c=0,d=0,e=0;
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 == 1)+(a == 3) == 1) &&
((b == 2)+(e == 4) == 1) &&
((c == 1)+(d == 2) == 1) &&
((c == 5)+(d == 3) == 1) &&
((e == 4)+(a == 1) == 1))
{
printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
system("pause");
return 0;
}


      虽然使用五个for循环得出了结果:
      


      但是有的结果却是不符合实际情况的,因为在实际比赛中名次是可以并列的,但是必须存在第一名,而且名次必须是连续的,通过观察上述比赛结果发现有很多都是不正确的结果,那仫如何去排除这些不符合实际的排序结果呢?
      想法思路如下:
      如果有一个整形的数据它的32位都为0,在满足题意的情况下我们将它的对应位置置为1,也就是说该运动员是第几名就将该位置的0置为1,通过置位之后此时我们只需要判断这个数据的低几位是否连续就可以了,如果低位没有连续的1,就将标志位置1,而存在连续的1也就是满足题意的结果直接输出就可以了;下面是我的一个简单分析图:
      


        完整的代码实现如下:
        
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int main()
{
int tmp=0,flag=0;
int a=0,b=0,c=0,d=0,e=0;
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 == 1)+(a == 3) == 1) &&
((b == 2)+(e == 4) == 1) &&
((c == 1)+(d == 2) == 1) &&
((c == 5)+(d == 3) == 1) &&
((e == 4)+(a == 1) == 1))
{
tmp |= (1 << (a-1));  //是第几名就将对应的位置置为1
tmp |= (1 << (b-1));
tmp |= (1 << (c-1));
tmp |= (1 << (d-1));
tmp |= (1 << (e-1));
flag=0;
while(tmp)
{
if(tmp%2 == 0)
{
flag=1;  //低位没有连续的1
}
tmp/=2;
}
if(flag == 0)
printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
system("pause");
return 0;
}


      


日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为四个嫌疑犯的一个,以下为四个嫌疑犯的供词:A说:不是我,B说:是C,C说:是D,D说:C在说胡话;已知只有三个人说了真话有一个人说了假话,请确定杀人者是谁,详情请见下面链接:

      
http://blog.csdn.net/qq_34328833/article/details/51010865
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息