| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1674 人关注过本帖, 3 人收藏
标题:一道编程题~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(3)
已结贴  问题点数:20 回复次数:13 
一道编程题~
我国有4大淡水湖。
A说:洞庭湖最大,洪泽最小。鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二。太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
4个人每人仅答对了一个,请你编程给出4个湖从大到小的顺序
用C语言或C++编程,如何组织```需要全部过程

这段时间有人单独给九九出考题了~不能多说情况~帮忙看看就行了~
搜索更多相关主题的帖子: 鄱阳湖 洞庭湖 洪泽湖 淡水湖 C语言 
2017-02-09 11:13
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:5 
/*
我国有4大淡水湖。
A说:洞庭湖最大,洪泽最小。鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二。太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
4个人每人仅答对了一个,请你编程给出4个湖从大到小的顺序
用C语言或C++编程,如何组织```需要全部过程
*/
#include<stdio.h>
int main()
{
    int i,id,idx,index;char lake[4][10]={"hongze","dongtin","boyang","taihu"};
    int tag[4]={0,0,0,0};//记录是否排过
    char first[10],second[10],third[10],fourth[10];
    for(i=0;i<4;i++)
    {
        tag[0]=tag[1]=tag[2]=tag[3]=0;
        strcpy(first,lake[i]);
        tag[i]=1;
        for(id=0;id<4;id++)
        {
            if(!tag[id])
            {
                strcpy(second,lake[id]);
                tag[id]=1;
                for(idx=0;idx<4;idx++)
                {
                    if(!tag[idx])
                    {
                        strcpy(third,lake[idx]);
                        tag[idx]=1;
                        for(index=0;index<4;index++)
                        {
                            if(!tag[index])
                            {
                                strcpy(fourth,lake[index]);
                                tag[index]=1;
                                //printf("%s\t%s\t%s\t%s\n",first,second,third,fourth);
                                tag[index]=0;
                                if((strcmp(first,lake[1])==0)+(strcmp(fourth,lake[0])==0)+(strcmp(third,lake[2])==0)!=1)
                                    continue;//A不满足只对一个
                                if((strcmp(first,lake[0])==0)+(strcmp(fourth,lake[1])==0)+(strcmp(second,lake[2])==0)+(strcmp(third,lake[3])==0)!=1)
                                    continue;//B不满足只对一个
                                if((strcmp(fourth,lake[0])==0)+(strcmp(third,lake[1])==0)!=1)
                                    continue;//C不满足只对一个
                                if((strcmp(first,lake[2])==0)+(strcmp(fourth,lake[3])==0)+(strcmp(second,lake[0])==0)+(strcmp(third,lake[1])==0)!=1)
                                    continue;//D不满足只对一个
                                printf("%s\t%s\t%s\t%s\n",first,second,third,fourth);return 0;
                            }
                        }
                        tag[idx]=0;
                    }
                }
                tag[id]=0;
            }
        }
    }
    return 0;
}
2017-02-09 12:50
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:5 
数据定义:
char lake[4][10]={洞庭,太湖,鄱阳,洪泽};
int abcd[4][4]={{1,2,3,4},{4,3,2,1},{0,0,1,4},{3,4,1,2}},count[4]={0},pre[4]={1,2,3,4};
算法:对pre[4]做全排列,然后依次将全排列结果和abcd数组依次比较,位置相同则对count[pri[]]的相应位置加一,如果count的元素大于2则这个全排列不是正确答案,如果count的各元素值都为1则这个全排列的顺序正确,以这个全排列的结果为序号输出lake里的湖名称。
2017-02-09 13:10
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:5 
程序代码:
#include<stdio.h>
//1 洞庭湖  
//3 鄱阳湖
//2 太湖
//0 洪泽湖 
char s[4][8]={"洪泽湖","洞庭湖","太湖","鄱阳湖"}; 
int a[4]={2,-1,4,1};       //A认为的次序      -1表示不知道 
int b[4]={1,4,3,2};       //B... 
int c[4]={-1,-1,2,1};     //C...
int d[4]={4,1,2,3};       //D...
int e[4];
int fun(int a[],int b[],int c[],int d[] ,int e[])    //代入去验算是否有每个人都只答对一个
{                                                    //数组a,b,c,d一直不会变,变得是数组e 
    int fla[4]={0};
    int i;
    for(i = 0; i < 4; i++)
    {
        if(a[i]==e[i])
            fla[0]++;          //答对一个湖加1 
        
        if(b[i] == e[i])
            fla[1]++;
        
        if(c[i] == e[i])
            fla[2]++;
        
        if(d[i] == e[i])
            fla[3]++;
    }
    
    if(fla[0]==1 && fla[1]==1 && fla[2]==1 && fla[3]==1)  //每个人只答对一个湖 
    {
        return 1;
    }
    return 0;
}

int main(void)
{
    int i, j, k, t;
    
    for(i=1;i<5;i++) /*对四湖排名分别赋值*/
    for(j=1;j<5;j++) 
    for(k=1;k<5;k++)
    for(t=1;t<5;t++) 
    if(i+j+k+t==10&&i*j*k*t==24)            //4个数字必须要不一样 
    {        
        e[0]=i, e[1]=j, e[2]=k, e[3]=t;
        if(fun(a,b,c,d,e))
        {
            printf("%-9s%-9s%-9s%-9s\n",s[i-1],s[j-1],s[k-1],s[t-1]);
          
            return 0;
        }
    } 
    
    return 0;
}


[此贴子已经被作者于2017-2-9 14:54编辑过]


早知做人那么辛苦!  当初不应该下凡
2017-02-09 13:45
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
九九的代码~

程序代码:
/*
我国有4大淡水湖。 
A说:洞庭湖最大,洪泽最小。鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二。太湖第三。 
C说:洪泽湖最小,洞庭湖第三。 
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。 
4个人每人仅答对了一个,请你编程给出4个湖从大到小的顺序
用C语言或C++编程,如何组织```需要全部过程
*/
#include<stdio.h>
int main()
{
    char *p[]={"洞庭湖","洪泽湖","鄱阳湖","太湖"};
    int a[24][4]=
    {
        {1,2,3,4},{1,2,4,3},{1,3,2,4},{1,3,4,2},{1,4,2,3},{1,4,3,2},
        {2,1,3,4},{2,1,4,3},{2,3,1,4},{2,3,4,1},{2,4,1,3},{2,4,3,1},
        {3,1,2,4},{3,1,4,2},{3,2,1,4},{3,2,4,1},{3,4,1,2},{3,4,2,1},
        {4,1,2,3},{4,1,3,2},{4,2,1,3},{4,2,3,1},{4,3,1,2},{4,3,2,1}
    };

    int i=0;
    int j=0;

    for (i=0;i<24;i++)
    {
        int flag=0;

        if (((a[i][0]==1)+(a[i][1]==4)+(a[i][2]==3))==1)
            flag++;

        if (((a[i][1]==1)+(a[i][0]==4)+(a[i][2]==2)+(a[i][3]==3))==1)
            flag++;

        if (((a[i][1]==4)+(a[i][0]==3))==1)
            flag++;

        if (((a[i][2]==1)+(a[i][3]==4)+(a[i][1]==2)+(a[i][0]==3))==1)
            flag++;

        if (flag==4)
            for (j=0;j<4;j++)
                printf("%-10s%d\n",p[j],a[i][j]);
    }

    return 0;
}


[此贴子已经被作者于2017-2-9 15:32编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-09 14:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
回复 4楼 炎天
我试验的结果和你一样
输出:
鄱阳 洞庭 太湖 洪泽
洪泽 太湖 洞庭 鄱阳

C++ Code:
程序代码:
#include <cstdio>
#include <algorithm>

bool foo( const char* a, const char* b )
{
    size_t cnt = 0;
    for( size_t i=0; i!=4; ++i )
        cnt += a[i]==b[i];
    return cnt==1;
}

int main( void )
{
    const char* ns[] = { "鄱阳", "洞庭", "太湖", "洪泽" };
    const char* as[] = { "2314", "4132", "0024", "1423" };

    char buf[] = "1234";
    do
    if( foo(buf,as[0]) && foo(buf,as[1]) && foo(buf,as[2]) && foo(buf,as[3]) )
        printf( "%s %s %s %s\n", ns[buf[0]-'1'], ns[buf[1]-'1'], ns[buf[2]-'1'], ns[buf[3]-'1'] );
    while( std::next_permutation(buf,buf+4) );

    return 0;
}

2017-02-09 14:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
献上出题人提供的答案~

程序代码:
//第一种(C++):
#include //预编译命令
using namespace std; 
int main() //主函数
{ //主函数开始
int Dt,Hz,Py,Th,sum[4]={0,0,0,0}; //定义变量
char lake[5][10];
//Dt表示洞庭湖,Hz表示洪泽湖,Py表示鄱阳湖,Th表示太湖
//穷举四大湖排名的所有可能,用1、2、3、4分别来表示它们的大小关系
//1最大,4最小
for(Dt=1; Dt=4; Dt++){
for(Hz=1; Hz=4; Hz++){
if(Dt==Hz) 
continue;//湖的面积各不相同
for(Py=1; Py=4; Py++){
if(Py==Hz || Py==Dt)
continue;//湖的面积各不相同
Th=10-Dt-Hz-Py;//计算太湖的排名
sum[0]= (1==Dt) + (4==Hz) + (3==Py);//A说的话
sum[1]= (1==Hz) + (4==Dt) + (2==Py) + (3==Th);//B说的话
sum[2]= (4==Hz) + (3==Dt);//C说的话
sum[3]= (1==Py) + (4==Th) + (2==Hz) + (3==Dt);//D说的话
if(sum[0]==1 && sum[1]==1 && sum[2]==1 && sum[3]==1){
strcpy (lake[Dt], "洞庭湖");//按排名赋值
strcpy (lake[Hz], "洪泽湖");
strcpy (lake[Py], "鄱阳湖");
strcpy (lake[Th], "太湖");
}
}
}
}
for(int i=1;i=4;i++){
coutlake[i]endl;//从大到小输出
}
return 0;//主函数结束
}
//第二种(c语言):
#include
int main(void)
{
int a,b,c,d; /*四湖的顺序数,分别表示洞庭湖,洪泽湖,鄱阳湖,太湖*/
for(a=1;a5;a++) /*对四湖排名分别赋值*/
for(b=1;b5;b++) 
for(c=1;c5;c++)
for(d=1;d5;d++) 
if(a+b+c+d==10&&a*b*c*d==24) /*限定abcd的值互不相等,即不出现并列的情况*/ 
if(a==1&&b!=4&&c!=3||a!=1&&b==4&&c!=3||a!=1&&b!=4&&c==3) /*A的话*/
if(b==1&&a!=4&&c!=2&&d!=3||b!=1&&a==4&&c!=2&&d!=3 ||b!=1&&a!=4&&c==2&&d!=3||b!=1&&a!=4&&c!=2&&d==3) /*B的话*/
if(b==4&&a!=3||b!=4&&a==3) /*C的话*/ 
if(c==1&&d!=4&&b!=2&&a!=3||c!=1&&d==4&&b!=2&&a!=3 ||c!=1&&d!=4&&b==2&&a!=3||c!=1&&d!=4&&b!=2&&a==3) /*D的话*/ 
printf("四湖的大小顺序:\n洞庭湖:%d\n洪泽湖:%d\n鄱阳湖:%d\n太湖:%d\n",a,b,c,d);
return 0;
}


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-09 14:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 炎天
怎么答案有两个?看看九九的哪里出问题了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-09 14:16
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 6楼 rjsp
答案是只有一个啊, 一开始我根据A的话得出太湖是第二,这样一来就默认根据A的话就可以得出两个正确的湖.但是题目只是说回答正确个数,并没没说推想出来的正确,
A的话值得深究

早知做人那么辛苦!  当初不应该下凡
2017-02-09 14:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用炎天在2017-2-9 14:57:05的发言:

答案是只有一个啊, 一开始我根据A的话得出太湖是第二,这样一来就默认根据A的话就可以得出两个正确的湖.但是题目只是说回答正确个数,并没没说推想出来的正确,
A的话值得深究
只能说题目不严谨,因为题目中有“我国有4大淡水湖”这句话。

我来编个段子:
主持人:你们这对双胞胎长得一模一样,告诉我谁大谁小?
XXX:我是姐姐。
主持人:哇,你只知道自己是姐姐,也就是说你也看不出谁是妹妹?!
XXX:
收到的鲜花
  • 炎天2017-02-09 15:42 送鲜花  6朵   附言:我很赞同
2017-02-09 15:13
快速回复:一道编程题~
数据加载中...
 
   



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

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