回溯法求解七巧板涂色问题

算法描述

【问题描述】
有如图所示的七巧板,试编写一源程序如下,使用至多四种不同颜色对七巧板进行涂色(每块涂一种颜色),要求相邻区域的颜色互不相同,打印输出所有可能的涂色方案。
图片
【问题分析】
为了让算法能识别不同区域间的相邻关 系,我们把七巧板上每一个区域看成一个顶点若两个区域相邻,则相应的顶点间用一条边相连,这样该问题就转化为图一个图的搜索问题了。

C语言实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
int m, pointnum, edgenum, sum = 0;
int Graph[100][100], x[100];

void InPut() {
int pos1, pos2;
printf("请输入点的个数和色数(p m):");
scanf("%d%d",&pointnum,&m);
printf("请输入边的个数: ");
scanf("%d",&edgenum);
printf("输入边的起始点信息(起点 终点):\n");
for(int i = 1; i <= edgenum; ++i) {
scanf("%d%d",&pos1,&pos2);
Graph[pos1][pos2] = Graph[pos2][pos1] = 1;
}
}

int IsOk(int i) {
for(int j = 1; j < i; ++j)
if(Graph[i][j] == 1 && x[j] == x[i])
return 0;
return 1;
}

void BackTrack(int i) {
if(i > pointnum) {
sum += 1;
printf("方法 %d:",sum);
for(int j = 1; j <= pointnum; ++j) {
printf(" %d",x[j]);
}
printf("\n");
} else {
for(int j = 1; j <= m; ++j) {
x[i] = j;
if(IsOk(i))
BackTrack(i + 1);
x[i] = 0;
}
}
}
int main() {
InPut();
BackTrack(1);
printf("一共有%d种绘色方案",sum);
}

运行截图

图片