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