用matlab编程实现的,不知道有没有简单方法
% %实验小程序
%题目:1.A有3个妹妹;2B有一个哥哥;3.C是女的,她有2个妹妹;4.D有2个弟弟;5.E有2个姐姐;6.F也是女的,但她和G没有妹妹。根据这些条件,你能推算出谁是男性,谁是女性吗?
%来源:
https://bbs.pinggu.org/thread-1591973-1-1.html
%方法:穷举法
clear all
clc
%0为男性,1为女性
%A中存储7个人的性别,按年龄顺序
%B中存储对应人的姐姐、哥哥、妹妹、弟弟的人数
%D为中间变量
%C为最终输出,每行为一种情况,共22种,每行依次分别为[11-17(表示A-G),1-7(年龄从大到小),0-1(性别0为女,1为男),,,]
%E为最终输出,每行为一种情况,共22种,每行依次分别为年龄从大到小排列的A-G和性别
k = 1;
C = zeros(22,21);
D = zeros(3,7);
E = char(22,21);
for i = 0 : 1 : 127
A = zeros(7,1);
B = zeros(7,4);
s = dec2bin(i,7);
for j = 1:7
A(j) = str2double(s(j));
end
for j = 1:7
sum1 = sum(A(1:j-1));
sum2 = sum(A(j+1:end));
B(j,:) = [sum1,j - 1 - sum1,sum2,7 - j - sum2];
end
for j1 = 1:7
if B(j1,3) == 3
for j2 = 1:7
if j2 ~= j1
if B(j2,2) == 1
for j3 = 1:7
if (j3 - j2) * (j3 - j1) ~= 0
if (B(j3,3) == 2) && (A(j3) == 1)
for j4 = 1:7
if (j4 - j3) * (j4 - j2) * (j4 - j1) ~= 0
if B(j4,4) == 2
for j5 = 1:7
if (j5 - j4) * (j5 - j3) * (j5 - j2) * (j5 - j1) ~= 0
if B(j5,1) == 2
for j6 = 1:7
if (j6 - j5) * (j6 - j4) * (j6 - j3) * (j6 - j2) * (j6 - j1) ~= 0
if (B(j6,3) == 0) && (A(j6) == 1)
for j7 = 1:7
if (j7 - j6) * (j7 - j5) * (j7 - j4) * (j7 - j3) * (j7 - j2) * (j7 - j1) ~= 0
if B(j7,3) == 0
%按年龄排序
D = [11,j1,A(j1)-2;12,j2,A(j2)-2;13,j3,A(j3)-2;14,j4,A(j4)-2;15,j5,A(j5)-2;16,j6,A(j6)-2;17,j7,A(j7)-2;];
D = sortrows(D,2)';
C(k,:) = D(:);
%数字转换为可读字符串
m = 1;
for l = 1:21
param = C(k,l);
if param == -1
E(k,m:m+1) = '女 ';
m = m + 2;
elseif param == -2
E(k,m:m+1) = '男 ';
m = m + 2;
elseif param == 11
E(k,m) = 'A';
m = m + 1;
elseif param == 12
E(k,m) = 'B';
m = m + 1;
elseif param == 13
E(k,m) = 'C';
m = m + 1;
elseif param == 14
E(k,m) = 'D';
m = m + 1;
elseif param == 15
E(k,m) = 'E';
m = m + 1;
elseif param == 16
E(k,m) = 'F';
m = m + 1;
elseif param == 17
E(k,m) = 'G';
m = m + 1;
end
end
k = k + 1;
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
disp('A-G按年龄排序为')
E