c++试题(18)

上地理课时,四个学生回答我国四大淡水湖的大小时说:
        甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
          乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三
        丙:鄱阳湖最小,洞庭湖第三。
        丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
对于每个湖的大小,每人仅答对了一个。请判断四个湖的大小。
请写出分析思路和代码。这是老师的问题,因为时间紧,我也在做,同时请教最好的设计思路!

//   a,b,c,d   =   洞庭湖,洪泽湖,鄱阳湖,太湖
#define   N   4
char   a[N]   =   {   'a','b','c','d'   }
void   fun   (   char   a[],   const   int   i,   cosnt   int   n   )
{
if   (   i   ==   n-1   )
{
bool   c1   =   (a[0]   ==   'a'   &&   a[1]   !=   'b'   &&   a[2]   !=   'c')  
||   (a[0]   !=   'a'   &&   a[1]   ==   'b'   &&   a[2]   !=   'c')
||   (a[0]   !=   'a'   &&   a[1]   !=   'b'   &&   a[2]   ==   'c'
)
bool   c2   =   ……………………………………………………
bool   c3   =   ……………………………………………………
if   (   c1   &&   c2   &&   c3   &&   c4   )
for   (   int   j   =   0;   j   <   n;   j++   )
cout   <<   "第"   <<   j+1   <<   “是"   <<   a[j]   <<   endl;
}
else  
for   (   int   s   =   i;   s   <   n;   s++   )
{
char   temp   =   a[s];
a[s]   =   a[i];
a[i]   =   temp;
fun   (   a,   i+1,   n   );
temp   =   a[s];
a[s]   =   a[i];
a[i]   =   a[s];
}
}

 

#include   <iostream>
#include<fstream.h>

class   Run
{
public:

void   Read()
{
m_A   =new   int[4];
m_B   =new   int[4];
m_C   =new   int[4];
m_D   =new   int[4];
ifstream   in;
in.open("rr.txt");
char   t;
// while(!in.eof())
// {
for(int   i=0;   i!=4;   ++i)
{
in.get(t);
m_A[i]   =atoi(&t);
}
for(i=0;   i!=4;   ++i)
{
in.get(t);
m_B[i]   =atoi(&t);
}
for(i=0;   i!=4;   ++i)
{
in.get(t);
m_C[i]   =atoi(&t);
}
for(i=0;   i!=4;   ++i)
{
in.get(t);
m_D[i]   =atoi(&t);
}
// }
}

void   Set()
{
m_A   =new   int[4];
m_B   =new   int[4];
m_C   =new   int[4];
m_D   =new   int[4];
cout<<"lake1       | lake2       | lake3       |       lake4"<<endl;
cout<<"A:   ";
for(int   i=0;   i!=4;   ++i)
cin>>m_A[i];
cout<<"B:   ";
for(i=0;   i!=4;   ++i)
cin>>m_B[i];
cout<<"C:   ";
for(i=0;   i!=4;   ++i)
cin>>m_C[i];
cout<<"D:   ";
for(i=0;   i!=4;   ++i)
cin>>m_D[i];
}


void   Sort()
{
for(lake1=1;   lake1!=5;   ++lake1)
{
for(lake2=1;   lake2!=5;   ++lake2)
{
if(lake2   ==   lake1)
{
continue;
}
for(lake3=1;   lake3!=5;   ++lake3)
{
if(   lake3   ==lake1   ||   lake3   ==lake2)
{
continue;
}
for(lake4=1;   lake4!=5;   ++lake4)
{
if(   lake1   ==   lake4   ||   lake2   ==lake4   ||   lake3   ==   lake4)
{
continue;
}
if(IsRight(m_A)   &&   IsRight(m_B)   &&   IsRight(m_C)   &&   IsRight(m_D))
{
cout<<"lake1:   "<<lake1;
cout<<"lake2:   "<<lake2;
cout<<"lake3:   "<<lake3;
cout<<"lake4:   "<<lake4;
}
}
}
}
}
}

protected:
bool   IsRight(int   order[4])
{
int   count   =0;
if(lake1   ==   order[0])   ++count;
if(lake2   ==   order[1])   ++count;
if(lake3   ==   order[2])   ++count;
if(lake4   ==   order[3])   ++count;
return   count==1;
}

protected:
int   *m_A;
int   *m_B;
int   *m_C;
int   *m_D;

int   lake1;
int   lake2;
int   lake3;
int   lake4;
};

void   main   ()
{
Run aRun;
// aRun.Set();
aRun.Read();
aRun.Sort();
}


我刚写了一个啊`。
在程序文件夹里面包含一个“RR。TXT”里面包含(1243421334553124),这几个数字的意思是A人说:1号湖是最大,2号湖第二大,3号湖第4大,4号湖第3好。
这里总共16个数字就是代表这个意思。
但是不知道为什么程序找不到正确答案```郁闷ing

错错拉上面的算法不对这应该是推理问题
思路是这样的   呵呵
int   a[4],b[4],c[4],d[4];//四个学生的   答案   其中每个数组的第一位到第四位都分别代表   洞   潘   太   洪  
a[4]={1,3,   2,   4};//对于四个人的答案先初始化数组这个是甲   的答案
b[4]={。。。。};
c[4]={。。。。};
d[4]={。。。。};//没有的就全给0
int   i   ;
for(i=0;i<4;i++)
{(a[i]==b[i])?a[i]=b[i]=0;
(b[i]==c[i])?b[i]=c[i]=0;
...
...
...
}
//肯定有一个数组里面有且仅有一个元素不为0;
接着继续判断   就是把这一项的对应项目全给0   ;
接着就没几个数字拉    
后来就要扫描数组   进行判断拉我想出来拉但是没时间拉不写拉

拉上面的算法不对这应该是推理问题
思路是这样的   呵呵
int   a[4],b[4],c[4],d[4];//四个学生的   答案   其中每个数组的第一位到第四位都分别代表   洞   潘   太   洪  
a[4]={1,3,   2,   4};//对于四个人的答案先初始化数组这个是甲   的答案
b[4]={。。。。};
c[4]={。。。。};
d[4]={。。。。};//没有的就全给0
int   i   ;
for(i=0;i<4;i++)
{(a[i]==b[i])?a[i]=b[i]=0;
(b[i]==c[i])?b[i]=c[i]=0;
...
...
...
}
//肯定有一个数组里面有且仅有一个元素不为0;
接着继续判断   就是把这一项的对应项目全给0   ;
接着就没几个数字拉    
后来就要扫描数组   进行判断拉我想出来拉但是没时间拉不写拉

 

 

#include   <iostream>
#include<fstream.h>

class   Run
{
public:

void   Read()
{
m_A   =new   int[4];
m_B   =new   int[4];
m_C   =new   int[4];
m_D   =new   int[4];
ifstream   in;
in.open("rr.txt");
char   t;
// while(!in.eof())
// {
for(int   i=0;   i!=4;   ++i)
{
in.get(t);
m_A[i]   =atoi(&t);
}
for(i=0;   i!=4;   ++i)
{
in.get(t);
m_B[i]   =atoi(&t);
}
for(i=0;   i!=4;   ++i)
{
in.get(t);
m_C[i]   =atoi(&t);
}
for(i=0;   i!=4;   ++i)
{
in.get(t);
m_D[i]   =atoi(&t);
}
// }
}

void   Set()
{
m_A   =new   int[4];
m_B   =new   int[4];
m_C   =new   int[4];
m_D   =new   int[4];
cout<<"lake1       | lake2       | lake3       |       lake4"<<endl;
cout<<"A:   ";
for(int   i=0;   i!=4;   ++i)
cin>>m_A[i];
cout<<"B:   ";
for(i=0;   i!=4;   ++i)
cin>>m_B[i];
cout<<"C:   ";
for(i=0;   i!=4;   ++i)
cin>>m_C[i];
cout<<"D:   ";
for(i=0;   i!=4;   ++i)
cin>>m_D[i];
}


void   Sort()
{
for(lake1=1;   lake1!=5;   ++lake1)
{
for(lake2=1;   lake2!=5;   ++lake2)
{
if(lake2   ==   lake1)
{
continue;
}
for(lake3=1;   lake3!=5;   ++lake3)
{
if(   lake3   ==lake1   ||   lake3   ==lake2)
{
continue;
}
for(lake4=1;   lake4!=5;   ++lake4)
{
if(   lake1   ==   lake4   ||   lake2   ==lake4   ||   lake3   ==   lake4)
{
continue;
}
if(IsRight(m_A)   &&   IsRight(m_B)   &&   IsRight(m_C)   &&   IsRight(m_D))
{
cout<<"lake1:   "<<lake1;
cout<<"lake2:   "<<lake2;
cout<<"lake3:   "<<lake3;
cout<<"lake4:   "<<lake4;
}
}
}
}
}
}

protected:
bool   IsRight(int   order[4])
{
int   count   =0;
if(lake1   ==   order[0])   ++count;
if(lake2   ==   order[1])   ++count;
if(lake3   ==   order[2])   ++count;
if(lake4   ==   order[3])   ++count;
return   count==1;
}

protected:
int   *m_A;
int   *m_B;
int   *m_C;
int   *m_D;

int   lake1;
int   lake2;
int   lake3;
int   lake4;
};

void   main   ()
{
Run aRun;
// aRun.Set();
aRun.Read();
aRun.Sort();
}


我刚写了一个啊`。
在程序文件夹里面包含一个“RR。TXT”里面包含(1243421334553124),这几个数字的意思是A人说:1号湖是最大,2号湖第二大,3号湖第4大,4号湖第3好。
这里总共16个数字就是代表这个意思。
但是不知道为什么程序找不到正确答案```郁闷ing

问题分析:
        可以设洞庭湖、洪泽湖、鄱阳湖、太湖分别用变量A、B、C、D表示。每个变量的取值是1~4。
        因为每个只答对了一个,所以,他们的叙述可以表示为:
      甲:(A=1)+(B=4)+(C=3)=-1
    乙:(B=1)+(A=4)+(C=2)+(D=3)=-1
    丙:(B=4)+(A=3)=-1
    丁:(C=1)+(D=4)+(B=2)+(A=3)=-1
    只有以上条件都满足时,才能找到正确答案。

FOR   A   =   1   TO   4
    FOR   B   =   1   TO   4
        FOR   C   =   1   TO   4
            D   =   10   -   A   -   B   -   C
            IF   A   *   B   *   C   *   D   <>   24   THEN   GOTO   5
            P1   =   (A   =   1)   +   (B   =   4)   +   (C   =   3)
            P2   =   (B   =   1)   +   (A   =   4)   +   (C   =   2)   +   (D   =   3)
            P3   =   (B   =   4)   +   (A   =   3)
            P4   =   (C   =   1)   +   (D   =   4)   +   (B   =   2)   +   (A   =   3)
            IF   NOT   (P1   =   -1   AND   P2   =   -1   AND   P3   =   -1   AND   P4   =   -1)   THEN   GOTO   5
            PRINT   "Dongting   Lake",   "Hongze   Lake",   "Panyang   Lake",   "Tai   Lake"
            PRINT   A,   B,   C,   D
5   NEXT   C,   B,   A
END


有两组答案:
1.洞庭湖最大,洪泽湖第二,太湖第三,潘阳湖第四
2.   太湖最大,     鄱阳湖第二,   洞庭湖第三,洪泽湖第四
代码在下面,VC++6.0   +   Windows2000   下调试通过
***********************************************
条件分析:
1.湖名分析:
    湖名:     洞庭湖,洪泽湖,鄱阳湖,太湖
    简称:           1       ,   2,           3,         4
    在个位
2.大小分析:
      0,1,2,3分别为湖的大小,3为最大,0为最小
    在十位
3.第i人的言论是二维数组的第一个下标

依据以上原则把条件列入数组a[4][4]  

如:“洞庭湖最大”   则是     a[0][0]=31
***********************************************
  #include   "stdio.h"
#include   "iostream.h"

int   count=1;

bool   valid2(int   a,int   b)
{
    int   ai=0;
    int   aj=0;
    int   bi=0;
    int   bj=0;
   
      ai=a/10;
      bi=b/10;
      aj=a%10;
      bj=b%10;
   
    if(((ai==bi)&&(aj==bj))||((ai!=bi)&&(aj!=bj)))
          return   true;
    else  
          return   false;

}




bool   valid(int   a,int   b,int   c,int   d)
{
      if(valid2(a,b)&&valid2(a,c)&&valid2(a,d)&&valid2(b,c)&&valid2(b,d)&&valid2(c,d))
          return   true;
      else
          return   false;
}


void   printLake(int   a)
{
    switch(a%10)
      {
        case   1:   cout<<"洞庭湖"<<"   "<<a/10<<endl;
                        break;
        case   2:   cout<<"洪泽湖"<<"   "<<a/10<<endl;
                        break;
        case   3:   cout<<"鄱阳湖"<<"   "<<a/10<<endl;
                        break;
        case   4:   cout<<"太湖"<<"   "<<a/10<<endl;
                        break;
        default:
                        break;
      }

}

void   printAll(int   a,int   b,int   c,int   d)
{
cout<<endl;
cout<<"-------------------the   right"<<"   "<<count<<"   "<<"--BEGIN(the   bigger   the   larger)-------"<<endl;
printLake(a);
printLake(b);
printLake(c);
printLake(d);
cout<<"-------------------the   right"<<"   "<<count<<"   "<<"--END--------------------------------"<<endl;
count++;
}





void   main()
{
int   i;
int   j;
int   k;
int   m;

int   a[4][4]={0};       //初始化条件数组
a[0][0]=31;
a[0][1]=02;
a[0][2]=13;
a[0][3]=24;         //必须填写   否则可能会少检验几种情况

a[1][0]=32;
a[1][1]=01;
a[1][2]=23;
a[1][3]=14;

a[2][0]=03;
a[2][1]=11;

a[3][0]=33;
a[3][1]=22;
a[3][2]=11;
a[3][3]=04;
  cout<<"----BEGIN-------"<<endl;
for(i=0;i<3;i++)
    for(j=0;j<4;j++)
      {
        if(valid2(a[0][i],a[1][j]))                   //加快查找速度,从已不合理的分支退出
        {
        for(k=0;k<2;k++)
          for(m=0;m<4;m++)
            {
              if(valid2(a[2][k],a[3][m]))           //加快查找速度,从已不合理的分支退出
                {
                if(valid(a[0][i],a[1][j],a[2][k],a[3][m]))     //   合法性判断
                      printAll(a[0][i],a[1][j],a[2][k],a[3][m]);                         //解析并输出正解
                }
          }
        }
      }
  cout<<"----END---------"<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值