Pascal车牌项目4位数字排列 过滤对称重复组合实现求助
Pascal 4位车牌组合生成(排除对称重复序列)
核心需求
- 基于输入的4个数字生成从左到右排列的全组合
- 排除从右往左读和从左往右读完全相同的对称(回文)组合,即形如
abba、1221这类正反读一致的序列 - 原代码存在排列生成逻辑错误、数组访问语法错误、对称判断逻辑错位的问题,无法实现预期效果
原代码问题梳理
- 排列生成过程
mistura中的数组赋值逻辑错误,无法正确生成所有排列 - 对称判断的条件写法不符合Pascal数组访问语法,且判断位置放在输出循环中,逻辑错位
- 输入读取逻辑错误,原代码直接向结果数组的第一行读取4次输入,没有单独存储基础输入数字
- 输出循环硬编码遍历24个数组位置,没有匹配实际有效组合的数量,会输出大量无效0值
修正后可运行代码
program placa_generator; type placa = array [1..4] of integer; var a4num : array [1..24] of placa; // 4个不同数字全排列共24种,预留足够存储空间 linha : integer; const MAXDIG = 4; // 数组元素交换工具过程 procedure swap(var arr: placa; i,j: integer); var tmp: integer; begin tmp := arr[i]; arr[i] := arr[j]; arr[j] := tmp; end; procedure mistura(input : placa; index : integer); var p : integer; tmp_plate : placa; begin // 递归到最后一位时,判断是否为有效组合 if index = MAXDIG then begin // 4位对称回文判断规则:第1位=第4位 且 第2位=第3位,非对称组合才存入结果 if not ((input[1] = input[4]) and (input[2] = input[3])) then begin a4num[linha] := input; linha := linha + 1; end; exit; end; tmp_plate := input; for p := index to MAXDIG do begin swap(tmp_plate, index, p); mistura(tmp_plate, index + 1); swap(tmp_plate, index, p); // 回溯还原数组状态,保证排列生成正确 end; end; var i : integer; base_plate : placa; begin linha := 1; writeln('请输入4个用于生成车牌的数字,每行输入1个:'); for i := 1 to MAXDIG do readln(base_plate[i]); mistura(base_plate, 1); writeln('=== 排除对称组合后的有效车牌序列 ==='); for i := 1 to linha - 1 do begin write(a4num[i][1],a4num[i][2],a4num[i][3],a4num[i][4]); writeln; end; readln; // 防止运行后直接退出窗口 end.
关键实现说明
- 对称过滤直接嵌入排列生成的递归终止节点,不需要等所有排列生成完再二次遍历过滤,执行效率更高
- 全排列采用标准回溯交换实现,替换原代码中错误的数组拷贝逻辑,保证所有排列都能被正确生成
- 用
linha变量动态计数有效组合的实际数量,输出时只遍历有效存储位,不会输出无效的占位0值 - 4位对称组合的判断逻辑固定:只要第一位和第四位相等、第二位和第三位相等,就属于正反读完全一致的重复组合,直接跳过即可
内容的提问来源于stack exchange,提问作者Matheus V
相关产品推荐
相关产品推荐

