甲说:学生A得第一名,学生B得第三名。
乙说:学生C得第一名,学生D得第四名。
丙说:学生D得第二名,学生A得第三名。
竞赛结果表明,他们都说对了一半,并且无并列名次,试编程输出a,b,c,d各自得名次。
分析:这题和上一题差不多,只不过上一题只需要一个参数(小偷的编号),而这一题需要4个参数(一、二、三、四名)。
需要注意的是在判断语句中“加号”的优先级是高于“==”,所以下面的判断条件要加括号。((r1 == 1) + (r2 == 3) == 1 && (r3 == 1) + (r4 == 4) == 1 && (r4 == 2) + (r1 == 3) == 1)
另外:1、2、3、4四个数的全排列可以参考我的这篇博客:STL中计算排列组合关系的算法,来对下面得算法进行改进
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int r4;
for (int r1=1;r1<=4;++r1)
{
for (int r2=1;r2<=4;++r2)
{
if (r1 == r2)
{
continue;
}
for (int r3 = 1;r3<=4;++r3)
{
if (r3 == r1 || r3 == r2)
{
continue;
}
r4 = 10-r1-r2-r3;
if ((r1 == 1) + (r2 == 3) == 1 && (r3 == 1) + (r4 == 4) == 1 && (r4 == 2) + (r1 == 3) == 1)
{
cout<<r1<<'\t'<<r2<<'\t'<<r3<<'\t'<<r4<<endl;
}
}
}
}
return 0;
}
输出: 4 3 1 2