问题的提出:四位分别来自中国、美国、俄罗斯、加拿大的小学生都以自己的国土面积大而骄傲不已,
但是他们想知道到底谁的国土最大,谁的最小,他们的判断如下:
加拿大学生:加拿大最大,美国最小,俄罗斯第三。
美国学生:美国最大,加拿大最小,俄罗斯第二,中国第三。
俄罗斯学生:俄罗斯最大,中国最小,美国第二,加拿大第三。
中国学生:美国最小,加拿大第三。
他们互不相让,最后老师下定结论:对于上述四国面积的判断,他们每人只判断对了一个国家。对于老师的提示,四位小学生还是绞尽脑汁推断不出到底是谁的国土最大,谁的最小!现请编制程序告诉四位小学生正确顺序。
提示: 这是一个智力判断题,可用穷举法解。难点是找到这四个人判断的表达式。
-------------------------------------------------------------------------------------------
// CountryQuestion.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdarg.h"
#include "conio.h"
#define CHINA 1
#define CANADA 2
#define AMERICA 3
#define RUSSIA 4
int CheckOnly1Right(int rightans, const char* format, ...)
{
int country;
const char* p = format;
int count = 0;
int mask;
va_list(vars);
va_start(vars, format);
while (*p)
{
country = va_arg(vars, int);
mask = (rightans >> ((*p - '1') * 3)) & 7;
if (mask == country) count++;
p++;
}
va_end(vars);
return (count == 1);
}
int main(int argc, char* argv[])
{
int i1, i2, i3, i4;
int ans;
for ( i1 = 0; i1 < 4; i1++ )
for ( i2 = 0; i2 < 4; i2++ )
for ( i3 = 0; i3 < 4; i3++ )
for ( i4 = 0; i4 < 4; i4++ )
{
if (i1 == i2 || i1 == i3 || i1 == i4 || i2 == i3 || i2 == i4 || i3 == i4) continue;
/*
中国排在第i1(+1)位,加拿大排在第i2(+1)位...
*/
ans = CHINA << (i1 * 3);
ans |= CANADA << (i2 * 3);
ans |= AMERICA << (i3 * 3);
ans |= RUSSIA << (i4 * 3);
/*
加拿大学生:加拿大最大,美国最小,俄罗斯第三。
美国学生:美国最大,加拿大最小,俄罗斯第二,中国第三。
俄罗斯学生:俄罗斯最大,中国最小,美国第二,加拿大第三。
中国学生:美国最小,加拿大第三。
*/
if (CheckOnly1Right(ans, "143", CANADA, AMERICA, RUSSIA)
&& CheckOnly1Right(ans, "1423", AMERICA, CANADA, RUSSIA, CHINA)
&& CheckOnly1Right(ans, "1423", RUSSIA, CHINA, AMERICA, CANADA)
&& CheckOnly1Right(ans, "43", AMERICA, CANADA))
{
printf("China %dn", i1 + 1);
printf("Canada %dn", i2 + 1);
printf("America %dn", i3 + 1);
printf("Russia %dn", i4 + 1);
//break;
}
}
getch();
return 0;
}
用VC6.0在Console Application项目中编译通过