四色问题试题解析.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档