野鸭蛋的故事:

抛砖引玉,望有大神指导更好的方法. 用了4个小时...边改编想:

四个旅游家(张虹、印玉、东晴、西雨)去不同的岛屿去旅行,每个人都在岛上发现了野鸡蛋(1个到3个)。4人的年龄各不相同,是由18岁到21岁。已知:

  ①东晴是18岁。

  ②印玉去了A岛。

  ③21岁的女孩子发现的蛋的数量比去A岛女孩的多1个。

  ④19岁的女孩子发现的蛋的数量比去B岛女孩的多1个。

  ⑤张虹发现的蛋和C岛的蛋之中,有一者是2个。

  ⑥D岛的蛋比西雨的蛋要多2个。

  请问:张虹、印玉、东晴、西雨分别是多少岁?她们分别在哪个岛屿上发现了多少野鸡蛋?

大概思路是把 岛屿,年龄,姓名,鸭蛋数 当成一个结构,然后所有能搭配出的结构中 筛选出来符合要求的 结构。最后再在符合要求的结构 排列组合,选出符合要求的组合.(最开始时候 没筛选结构,直接排列组合去选 太多了....好长时间出不来....)

#include <iostream>
using namespace std;
//四个旅游家(张虹、印玉、东晴、西雨)去不同的岛屿去旅行,每个人都在岛上发现了野鸡蛋(1个到3个)。4人的年龄各不相同,是由18岁到21岁。已知:
//
//①东晴是18岁。
//
//②印玉去了A岛。
//
//③21岁的女孩子发现的蛋的数量比去A岛女孩的多1个。
//
//④19岁的女孩子发现的蛋的数量比去B岛女孩的多1个。
//
//⑤张虹发现的蛋和C岛的蛋之中,有一者是2个。
//
//⑥D岛的蛋比西雨的蛋要多2个。
//
//请问:张虹、印玉、东晴、西雨分别是多少岁?她们分别在哪个岛屿上发现了多少野鸡蛋?
struct Pei  
{
    string  Name; //姓名
    string  Dao;  //岛屿
    int     Sui; //年龄
    int     Shu;//野鸭蛋
};
string N[] = { "张虹","印玉","东晴","西雨" };
string D[] = { "A","B", "C","D" };
int    S[] = { 18,19,20,21 };
int    T[] = { 1,2,3};

bool weiyi(Pei lp[])  //组合中 姓名,岛,年龄唯一
{
    for (int i = 0; i < 4; i++)
    {
        for (int ii = 0; ii < 4; ii++)
        {
            if (ii != i)
            {
                if (lp[i].Dao == lp[ii].Dao ||lp[i].Name==lp[ii].Name||lp[i].Sui==lp[ii].Sui)
                {
                    return false;
                }
            }
        }
    }
  
    return true;
}



int main()
{
    int c = 0;
    int z[] = { 0,0,0,0};

    Pei  p[4 * 4 * 4 * 3];

    while (z[0]<4)
    {
        if ((N[z[1]] == N[2] && S[z[0]] == S[0]) || (N[z[1]] != N[2] && S[z[0]] != S[0]))     //  叫东晴 且18岁 或者不叫东晴也不是18岁 保留
        {
            if ((N[z[1]] == N[1] && D[z[2]] == D[0]) || (N[z[1]] != N[1] && D[z[2]] != D[0])) // 印玉 A岛  或者 不是印玉 也不是A岛
            {

                if ((S[z[0]] == 21 && D[z[2]] != D[0])|| S[z[0]] != 21 )                      // 21岁 女孩  不是A岛 或者不是21岁

                {
                    if ((S[z[0]] == 19 && D[z[2]] != D[1]) || S[z[0]] != 19)                    // 19岁 女孩  不是b岛 或者不是19岁

                    {
                        if ((N[z[1]] == N[0] && D[z[2]] != D[2]) || N[z[1]] != N[0])           //张虹 不是C,或者不是张虹

                        {

                            if ((N[z[1]] == N[3] && D[z[2]] != D[3] &&T[z[3]]==1) || (N[z[1]] != N[3]&&D[z[2]]==D[3]&& T[z[3]]==3)
                                ||(N[z[1]] != N[3] && D[z[2]] != D[3]))                            
                                //(叫西雨 不在D岛 只有1个蛋) 或者(不叫西雨 在D岛 且有三个蛋 )或者(不叫西雨也不在D岛)

                            {

                            
                                    p[c].Dao = D[z[2]];
                                    p[c].Name = N[z[1]];
                                    p[c].Shu = T[z[3]];
                                    p[c].Sui = S[z[0]];
                                    //     cout << c << ": " << S[z[0]] << "岁的 " << N[z[1]] << " 去了 " << D[z[2]] << " 岛,在岛上找到了 " << T[z[3]] << " 个野鸭蛋" << endl;

                                    c++;

                            }
                        }

                    }
                  
                }


            }
       
       }

      //  cout <<c <<": "<<S[z[0]] << "岁的 " << N[z[1]] << " 去了 " << D[z[2]] << " 岛,在岛上找到了 " << T[z[3]] << " 个野鸭蛋" << endl;
        
        z[3]++;
        for (int i = 3; i > 0; i--)
        {
            if (i == 3)
            {
                if (z[i] == 3)
                {
                    z[i] = 0;
                    z[i - 1] ++;
                }
            }
            else
            {
            if (z[i] == 4)
            {
                z[i] = 0;
                z[i - 1] ++;
            }
            }

        }

    }
    cout << "到了这里 : " <<c<< endl;
    int y[] = { 0,0,0,0 };
    int kkk = 0;
    int kka = 0;
    int kkb = 0;
    int kkc = 0;
    int kkd = 0;
    Pei KP[4];

    while (y[0]< c)
    {
        for (int i = 0; i < 4; i++)
        {
            KP[i] = p[y[i]];
        }
        if (p[y[0]].Dao == D[0] && p[y[1]].Dao == D[1] && p[y[2]].Dao == D[2] && p[y[3]].Dao == D[3])
                {
            kkk = kkk + 1;
        if (weiyi(KP))
        {

            kka = kka + 1;
            //if ((p[y[0]].Sui == 18 && p[y[0]].Name == N[2]) || (p[y[1]].Sui == 18 && p[y[1]].Name == N[2]) || (p[y[2]].Sui == 18 && p[y[2]].Name == N[2])
            //    || (p[y[3]].Sui == 18 && p[y[3]].Name == N[2])) //东晴 18岁

            //{
                
                    //if (p[y[0]].Name == N[1])       //印玉 A岛 
                    //{


                        if ((p[y[1]].Sui == 21 && p[y[1]].Shu - p[y[0]].Shu == 1) || (p[y[2]].Sui == 21 && p[y[2]].Shu - p[y[0]].Shu == 1)
                            || (p[y[3]].Sui == 21 && p[y[3]].Shu - p[y[0]].Shu == 1)) //21岁的女孩子 比去A岛的发现的 多1个
                        {

                            if ((p[y[0]].Sui == 19 && p[y[0]].Shu - p[y[1]].Shu == 1) || (p[y[2]].Sui == 19 && p[y[2]].Shu - p[y[1]].Shu == 1)
                                || (p[y[3]].Sui == 19 && p[y[3]].Shu - p[y[1]].Shu == 1)) //19岁的女孩子 比去B岛的发现的 多1个
                            {

                                //if (((p[y[0]].Name == N[0] && p[y[0]].Shu == T[1]) || p[y[2]].Shu == T[1]) ||
                                //    ((p[y[1]].Name == N[0] && p[y[1]].Shu == T[1]) || p[y[2]].Shu == T[1]) ||
                                //    ((p[y[3]].Name == N[0] && p[y[3]].Shu == T[1]) || p[y[2]].Shu == T[1])) //张虹发现的蛋 和C岛的岛  有1者是2个
                                if (((p[y[0]].Name == N[0] && p[y[0]].Shu == T[1]) || (p[y[1]].Name == N[0] && p[y[1]].Shu == T[1]) || (p[y[3]].Name == N[0] && p[y[3]].Shu == T[1])
                                    ) || p[y[2]].Shu == T[1]) //张虹发现的蛋 和C岛的岛  有1者是2个
                                {

                                    if ((p[y[3]].Shu - p[y[0]].Shu == 2 && p[y[0]].Name == N[3]) || (p[y[3]].Shu - p[y[1]].Shu == 2 && p[y[1]].Name == N[3])
                                        || (p[y[3]].Shu - p[y[2]].Shu == 2 && p[y[2]].Name == N[3]))
                                    {
                                        cout << "" << endl;
                                        for (int i = 0; i < 4; i++)
                                        {
                                            cout << kka << ": " << p[y[i]].Sui << "岁的 " << p[y[i]].Name << " 去了 " << p[y[i]].Dao << " 岛,在岛上找到了 " << p[y[i]].Shu << " 个野鸭蛋" << endl;

                                        }
                                        cout << "" << endl;
                                    }
                                }

                 /*           }
                        }*/
                    }


            }
        }


        }
                        



        y[3]++;
        for (int i = 3; i > 0; i--)
        {
            
            
                if (y[i] == c)
                {
                    y[i] = 0;
                    y[i - 1] ++;
                }
           

        }

    }
   
 
}




到了这里 : 27

29: 19岁的 印玉 去了 A 岛,在岛上找到了 2 个野鸭蛋
29: 20岁的 西雨 去了 B 岛,在岛上找到了 1 个野鸭蛋
29: 18岁的 东晴 去了 C 岛,在岛上找到了 2 个野鸭蛋
29: 21岁的 张虹 去了 D 岛,在岛上找到了 3 个野鸭蛋


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值