- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
【题2】四色问题
设有下列形状的图形:有n个区域(1≤n≤100),各区域的相邻关系用0(不相邻)、1(相邻)表示。例如表5.1.1的邻接矩阵对应图5.1.2。
1
2
3
4
5
6
7
8
1
0
1
0
0
0
0
1
1
2
1
0
1
0
0
1
1
0
3
0
1
0
1
0
1
0
0
4
0
0
1
0
1
1
0
0
5
0
0
0
1
0
1
0
0
6
0
1
1
1
1
0
1
0
7
1
1
0
0
0
1
0
1
8
1
0
0
0
0
0
1
0
表5.1.1
图5.1.2
将上面图形的每一部分涂上红(1)、黄(2)、蓝(3)、绿(4)四种颜色之一,要求相邻部分的颜色不同。输入文件为当前目录下的1.in,格式为
n
n*n的01矩阵
输出文件为当前目录下的1.out,格式为
1→区域1的颜色码
2→区域2的颜色码
??
n→区域n的颜色码
例如,对于上例,应输出
1—1
2—2
3—1
4—2
5—1
6—3
7—4
8—2
题解
按照涂色的先后顺序将方案存入堆栈s中,其中s[k]为区域k的颜色码,区域k为第k个涂色的区域。在计算过程中,我们总是对最近涂色的区域进行颜色调整,即所谓的“后进先出”,为此,必须记住下一个涂色的区域号i,该区域称之为“栈顶”(如图5.1.3)。区域i准备涂颜色j(1≤j≤4)
图5.1.3
我们采用试探法涂色。首先,将区域1涂红色(s[1]=1),并准备涂区域2(i=2),从颜色1开始试探
(j=1)。
区域i能否涂颜色j,关键取决于区域i的周边是否有同色区域。搜索已涂色的区域1?区域i-1中与区域i相邻的区域k,看一看这些区域是否涂了颜色j。判断条件是
(ki)and((s[k]j)or(矩阵的(i,k)=0))
由于矩阵元素只有0、1两个值,因此判断条件可以简写为矩阵的(i,k)*s[k]j
如果上述条件成立,则说明区域k是区域i相邻的不同色区域。搜索过程如下:
k:=1;
while(ki)and(s[k]*r[i,k]j)dok:=k+1;
搜索结束后,若k的值小于i,则说明区域i相邻的区域k已经涂了颜色j,按照颜色码递增顺序换一种颜色(j=j+1);否则说明区域i的周边没有涂颜色j的区域,区域i可以涂颜色j(s[i]=j)。“入栈”,准备涂区域i+1,从颜色1开始试探(i=i+1,j=1)。
我们对区域i,按照颜色码递增顺序试探颜色。如果区域i找不到合适的颜色(j4),则应该“出栈”,按照颜色码递增顺序调整区域i-1的颜色(i=i-1,j=s[i]+1)。
从区域1出发,依次类推,直至区域n涂好颜色为止(in)。由此得出算法:
var
i,j,k,n:integer;
r:array[1..100,1..100]of0..1; {邻接矩阵}
s:array[1..100]ofinteger; {区域的颜色表}
begin
readln(n); {读区域数}
fori:=1tondo {读邻接矩阵}
begin
forj:=1tondoread(r[i,j]);readln);
end;{for}
s[1]:=1; {区域1涂红色}
i:=2;j:=1; {指向区域2,从颜色1开始试探}
whilei=ndo {若区域n未涂色,则循环}
begin
while(j=4)and(i=n)do {寻找区域i的颜色}
begin
k:=1; {判断已涂色的区域1—区域i-1中是否存在与区域i相邻、且已涂了颜色j的区域}while(ki)and(s[k]*r[i,k]j)dok:=k+1;
ifkithenj:=j+1 {若存在已涂颜色j的相邻区域k,则换一种颜色}
elsebegin {若相邻的所有区域未涂颜色j,则“入栈”,区域i涂颜色j}s[i]:=j;
i:=i+1;j:=1; {区域i+1从颜色1开始试探}end;{else}
end;{while}
ifj4then {若区域i找不到合适的颜色,则“出栈”,区域i-1改涂下一种颜色}begini:=i-1;j:=s[i]+1;end;{then}
end;{while}
fori:=1tondowriteln(i,’---’,s[i]); {输出每一个区域的颜色}end.{main}
原创力文档


文档评论(0)