来自英、法、日、德的甲、乙、丙、丁四位旅客刚好碰在一起。他们除懂本国语言外,每人还会说其他三国语言的一种。有一种语言是三个人都会说的,但没有一种语言四人都懂 ,现知道:
(1)乙不会说英语,当甲与丙交谈时,他却能替他们做翻译
(2)甲是日本人,丁不会说日语,但他俩却能毫无困难地交谈
(3)乙、丙、丁交谈时,找不到共同语言
(4)四个人中,没有一个既能用日语交流同时又能用法语交谈
可见他们所会的语言情况是什么?
这个题用程序应该怎么设计?

解决方案 »

  1.   

    #include <iostream>
    using namespace std;const char str[2][4][10] = {{"日本人", "英国人", "法国人", "德国人"},
                            {"日语", "英语", "法语", "德语"}};
    int Person[4][2];bool Check()
    {
        //条件1
        if( Person[1][0] == 1 || Person[1][1] == 1 )
            return false;
        if( (Person[1][0] != Person[0][1] &&
            Person[1][1] != Person[0][0] &&
            Person[1][1] != Person[0][1]) ||
            (Person[1][0] != Person[2][1] &&
            Person[1][1] != Person[2][0] &&
            Person[1][1] != Person[2][1])
        )   return false;
        //甲丙不能直接交谈?
        if( Person[2][0] == Person[0][1] ||
            Person[2][1] == Person[0][0] ||
            Person[2][1] == Person[0][1])
            return false;
        //条件2
        if( (Person[0][0] != Person[3][1] &&
            Person[0][1] != Person[3][0] &&
            Person[0][1] != Person[3][1]) ||
            (Person[3][0] == 0 || Person[3][1] == 0)
        ) return false;    //条件3
        for(int l = 0; l < 4; l++)
        {
            if( (Person[1][0] == l || Person[1][1] == l) &&
                (Person[2][0] == l || Person[2][1] == l) &&
                (Person[3][0] == l || Person[3][1] == l) )
                return false;
        }    //条件4
        for(int p = 0; p < 4; p++)
        {
            if( (Person[p][0] == 0 && Person[p][1] == 2) ||
                (Person[p][0] == 2 && Person[p][1] == 0) )
            return false;
        }
        for(int i = 0; i < 4; i++)
        {
            cout << str[0][Person[i][0]] << ':' << str[1][Person[i][1]] << '\t';
        }
        cout << endl;
        return true;
    }void SetForeignLanguage(int n)
    {
        if( n == 4 )
        {
            Check();
        }
        else
        {
            for(int l = 0; l < 4; l++)
            {
                if( l == Person[n][0] ) continue;
                Person[n][1] = l;
                SetForeignLanguage( n + 1 );
            }
        }
    }void SetCountry(int n)
    {
        if( n == 4 )
        {
            SetForeignLanguage( 0 );
        }
        else
        {
            for(int c = 1; c < 4; c++)
            {
                int i = 0;
                for( ;i < n; i++)
                {
                    if( c == Person[i][0] ) break;
                }
                if( i == n )
                {
                    Person[n][0] = c;
                    SetCountry( n + 1 );
                }
            }
        }
    }int main(int argc, char* argv[])
    {
        Person[0][0] = 0;    SetCountry( 1 );
        system( "pause" );
        return 0;
    }
      

  2.   

    不好意思,没装Delphi,基本上是两层嵌套调用,现假设国家,再假设他们知道的外语,然后看是不是符合4个条件。