抛砖引玉,望有大神指导更好的方法. 用了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 个野鸭蛋