used: array[0..4 , 0..4] of integer; //与InfoArray对应的元素是否已用过
count_get, count_pr integer; //结果的个数、共进行了多少次递归运算
// 取得信息号和项目序号所对应的值并和给定值进行对比
function CompareItem(InfoID, ItemIndex: Integer; CompareText: string): Boolean;
begin
if (ItemIndex <= MatrixColCount) and (ItemIndex >= 0) then
Result := InfoArray[InfoID, Matrix[InfoID, ItemIndex]] = CompareText
else
Result := False;
end;
// 采用按'国籍'、'饮料'、'色彩'、'香烟'、'宠物'
// 五项信息依次对已生成的序列进行逻辑判断
function AccordWithLogic(InfoID: integer): boolean;
var
ItemIndex: Integer;
begin
Result := True;
for ItemIndex := 0 to 4 do
begin
case InfoID of
0:
begin
if CompareItem(0, ItemIndex, '挪威人') and not (ItemIndex = 0) then
Result := False;
end;
1:
begin
if (CompareItem(1, ItemIndex, '茶') and not CompareItem(0, ItemIndex, '丹麦人')) or
(CompareItem(1, ItemIndex, '牛奶') and not (ItemIndex = 2)) then
Result:=False;
end;
2:
begin
if (CompareItem(2, ItemIndex, '绿色') and not CompareItem(1, ItemIndex, '咖啡')) or
(CompareItem(2, ItemIndex, '红色') and not CompareItem(0, ItemIndex, '英国人')) or
(CompareItem(2, ItemIndex, '绿色') and not CompareItem(2, ItemIndex + 1, '白色')) or
(CompareItem(2, ItemIndex, '蓝色') and
not (CompareItem(0,ItemIndex + 1, '挪威人') or
CompareItem(0, ItemIndex - 1, '挪威人'))) then
Result:=False;
end;
3:
begin
if CompareItem(3, ItemIndex, 'Dunhill') and not CompareItem(2, ItemIndex, '黄色') or
CompareItem(3, ItemIndex, 'Prince') and not CompareItem(0, ItemIndex, '德国人') or
CompareItem(3, ItemIndex, 'Blue Master') and not CompareItem(1, ItemIndex, '啤酒') or
CompareItem(3, ItemIndex, 'Blends') and
not (CompareItem(1, ItemIndex + 1, '水') or
CompareItem(1, ItemIndex - 1, '水')) then
Result:=False;
end;
4:
begin
if CompareItem(4, ItemIndex, '狗') and not CompareItem(0, ItemIndex, '瑞典人') or
CompareItem(4, ItemIndex, '鸟') and not CompareItem(3, ItemIndex, 'Pall Mall') or
CompareItem(4, ItemIndex, '猫') and not (CompareItem(3, ItemIndex + 1, 'Blends') or
CompareItem(3, ItemIndex - 1, 'Blends')) or
CompareItem(4, ItemIndex, '马') and not (CompareItem(3, ItemIndex + 1, 'Dunhill') or
CompareItem(3, ItemIndex - 1, 'Dunhill')) then
Result:=False;
end;
end; //case end
if Result = False then
Exit;
end; //for end
end;
//打印结果
procedure PrintResult;
var
i, j: integer;
S: string;
begin
for j := 0 to 4 do
begin
for i := 0 to 4 do
begin
S := S + InfoArray[i, Matrix[i, j]] + ',';
end;
S := S + #13#10;
end;
form1.Memo1.Lines.Add(S);
end;
procedure FillMatrix(ItemIndex,InfoID:integer);
var
i: integer;
begin
inc(count_pro);
// 信息共五项,依次为 国家 饮料 色彩 香烟 宠物
// 用InfoID表示并定义为0-4, ItemIndex 表示每项信息的值
if ItemIndex > MatrixColCount then //如果这个信息所有的信息项全部用完
begin
if not AccordWithLogic(InfoID) then
//如果本次信息填充结果不能通过逻辑判定,则退出进行下一次填充
Exit;
if InfoID = MatrixRowCount then
//如果填充完了所有信息,则显示结果后退出,否则填充下一个信息
begin
PrintResult;
inc(count_get);
Exit;
end else
FillMatrix(0, InfoID + 1);
end;
for i := 0 to MatrixColCount do
begin
if (used[InfoID, i] = 0) then // 如果第i个元素未用过
begin
used[InfoID, i] := 1; // 使用第i个元素,作上已用标记,目的是使以后该元素不可用
Matrix[InfoID, ItemIndex] := i; // 保存当前搜索到的第i个元素到表格