nbhkdz.com冰点文库

七巧板染色

时间:2016-05-29


回专题模式 回学习阶段模式 【题目名称、来源】 七巧板染色(经典问题 qiqiaob.pas) 【问题描述】 如下图所示,七巧板中有一些板块是相邻的,现在要用红、黄、蓝、白四种颜色将七巧板 染色,要求任意相邻的两块板颜色不能相同,请枚举出所有方案和方案总数。

输入: N {共有多少相邻块,用两个相邻块编号表示,1 2 相邻不重复列举为 2 1} 12 16

23 24 34 45 46 56 57 67 输出: 所有方案 方案数 【所属专题】 回溯 【适合学习阶段】 第一阶段、第二阶段 【解题思路】 问题分析: 将七巧板抽象成图,相邻的板块之间有一条边,不相邻的板块间没有边。 存储结构: var tu:array [1..7,1..7] of integer{有七巧板抽象出来的图}; s:array[1..7] of integer;{栈,用来记录每一块板染成什么颜色 Four Color:1,2,3,4} color:array[1..4] of boolean;{标志数组,该颜色是否使用过} 【测试数据】 【源程序】 program qiqiaob;

var tu:array [1..7,1..7] of integer{有七巧板抽象出来的图}; s:array[1..7] of integer;{栈,用来记录每一块板染成什么颜色 Four Color:1,2,3,4} color:array[1..4] of boolean;{标志数组,该颜色是否使用过} i,j,count,n,head,tail:integer; function can(step,color:integer):boolean; var i:integer; begin can:=true; for i:= 1 to step do begin if (tu[step,i]=1)and(s[i]=color) then begin can:=false; break; end; end; end; procedure go(step:integer); var i,j,k:integer; begin for i:=1 to 4 do begin s[step]:=i;{color a board} if can(step,i) then begin if step=7 then begin for j:=1 to 7 do write(s[j],' '); writeln;count:=count+1; end else go(step+1); s[step]:=0;{回溯} end; end; end; begin assign(input,'qiqiaob.in'); assign(output,'qiqiaob.out'); reset(input); rewrite(output); for i:=1 to 7 do for j:=1 to 7 do tu[i,j]:=0; for i:=1 to 4 do color[i]:=false; count:=0; {初始化数组和变量} readln(n); for i:=1 to n do begin readln(head,tail); tu[head,tail]:=1;

tu[tail,head]:=1; end; go(1); writeln('count=',count); close(input); close(output); end.