计算概论(A) / B06 基础练习题(6)
http://pkuic.openjudge.cn/hw06/2/
2:四大湖
总时间限制: 1000ms 内存限制: 65536kB
描述
我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。
输入
无。
输出
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。
样例输入
(无)
样例输出
3
2
1
4
提示
http://pkuic.openjudge.cn/hw06/2/
2:四大湖
总时间限制: 1000ms 内存限制: 65536kB
描述
我国有4大淡水湖。
A说:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
B说:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
已知这4个湖的大小均不相等,4个人每人仅答对一个,
请编程按照鄱阳湖、洞庭湖、太湖、洪泽湖的顺序给出他们的大小排名。
输入
无。
输出
输出为4行,第1行为鄱阳湖的大小名次,从大到小名次分别表示为1、2、3、4;第2、3、4行分别为洞庭湖、太湖、洪泽湖的大小名次。
样例输入
(无)
样例输出
3
2
1
4
提示
样例输出仅供格式参考
code1:
/*
* sidahu.cpp
*
* Created on: Jul 10, 2016
* Author: moon
*/
#include<iostream>
using namespace std;
int main()
{
for(int poyang=1; poyang<5; poyang++)
{
for(int dongting=1; dongting<5; dongting++)
{
for(int tai=1; tai<5; tai++)
{
for(int hongze=1; hongze<5; hongze++)
{
//r记录四个湖的半径是否均不相等
bool r = (poyang != dongting) && (poyang != tai) && (poyang != hongze) && (dongting != tai) && (dongting != hongze) && (tai != hongze);
if(r)
{
/*
poyang dongting tai hongze
a 3 1 x 4
b 2 4 3 1
c x 3 x 4
d 1 3 4 2
*/
//a b c d分别记录四个人说的话
int a = (poyang == 3) + (dongting == 1) + (hongze == 4);
int b = (poyang == 2) + (dongting == 4) + (tai == 3) + (hongze == 1);
int c = (dongting == 3) + (hongze == 4);
int d = (poyang == 1) + (dongting == 3) + (tai == 4) + (hongze == 2);
if((a == 1) && (b == 1) && (c == 1) && (d == 1))
{
cout<< poyang << endl;
cout<< dongting << endl;
cout<< tai << endl;
cout<< hongze << endl;
cout<<endl<<endl;
}
}
}
}
}
}
return 0;
}
优化后
code2:
/*
* sidahu2.cpp
*
* Created on: Jul 10, 2016
* Author: moon
*/
#include<iostream>
using namespace std;
int main()
{
for(int poyang=1; poyang<5; poyang++)
{
for(int dongting=1; dongting<5; dongting++)
{
if(poyang != dongting)
{
for(int tai=1; tai<5; tai++)
{
if((poyang != tai) && (dongting != tai))
{
for(int hongze=1; hongze<5; hongze++)
{
if((poyang != hongze) && (dongting != hongze) && (tai != hongze))
{
/*
poyang dongting tai hongze
a 3 1 x 4
b 2 4 3 1
c x 3 x 4
d 1 3 4 2
a b c d分别记录四个人说的话
*/
int a = (poyang == 3) + (dongting == 1) + (hongze == 4);
int b = (poyang == 2) + (dongting == 4) + (tai == 3) + (hongze == 1);
int c = (dongting == 3) + (hongze == 4);
int d = (poyang == 1) + (dongting == 3) + (tai == 4) + (hongze == 2);
if((a == 1) && (b == 1) && (c == 1) && (d == 1))
{
cout<< poyang << endl;
cout<< dongting << endl;
cout<< tai << endl;
cout<< hongze << endl;
cout<<endl<<endl;
}
}
}
}
}
}
}
}
return 0;
}
再次优化:
/*
* sidahu3.cpp
*
* Created on: Jul 10, 2016
* Author: moon
*/
#include<iostream>
using namespace std;
int main()
{
//代表a、b、c、d四人说的话说对的数量。
int a,b,c,d;
//代表poyang鄱阳湖、dongting洞庭湖、tai太湖、h洪泽湖 的排名。1是最大,4是最小
int poyang,dongting,tai,hongze;
for(poyang=1; poyang<5; poyang++)
{
for(dongting=1; dongting<5; dongting++)
{
if(poyang!=dongting)
{
for(tai=1; tai<5; tai++)
{
if(poyang!=tai && dongting!=tai)
{
hongze = 10-poyang-dongting-tai;
a = (dongting == 1) + (hongze == 4) + (poyang == 3);
b = (hongze ==1) + (dongting == 4) + (poyang == 2) + (tai == 3);
c = (hongze == 4) + (dongting == 3);
d = (poyang == 1) + (tai == 4) + (hongze == 2) + (dongting == 3);
if(a*b*c*d == 1)
{
cout<<poyang<<endl<<dongting<<endl<<tai<<endl<<hongze<<endl;
}
}
}
}
}
}
return 0;
}
输出:
1
2
3
4