许多具有重要意义的数学定理都来自数学猜想,四色定理就是其中之一。任何一张地图只用四中颜色就能使具有共同边界的国家上不同的颜色。用数学语言表示,就是将平面任意细分为不相重叠的区域,每个区域总可以用1、2、3、4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。用直观的例子表示,如图4-1是世界地图的一部分,地图中国家用字母来编码。
用数字1、2、3、4代表不同的颜色,给地图进行着色,要求相邻的国家颜色不能一样,按照四中颜色的排列顺序,首先选择一种颜色着色,然后依次对编码B、C......的国家进行着色,着色的时候先检查相邻的颜色是否用过,如果用过,可以着该颜色,否则选择一下颜色再进行判断,当四个颜色都不可能是,则要回溯。当所有国家都涂上色以后,得到一种解法。
在着色的时候,要判断相邻国家的情况,国家之间的相邻关系可以通过矩阵存储起来,相邻赋值1,不相邻赋值0。
着色过程为,从编码A国家开始,按照四种颜色的排列顺序,首先选择一种颜色给其他着色,然后依次对编码B、C......进行着色,判定相邻国家是否用过该颜色,当所有国家都着色后,得出解法,退出过程。
package zk;
public class sy6 {
public static void main(String[] args) {
int n=7;
int r[][]={{0,1,0,0,0,1,1},{1,0,1,1,1,1,0},{0,1,0,1,0,0,0},
{0,1,1,0,1,0,0},{0,1,0,1,0,1,0},{1,1,0,0,1,0,1},{1,0,0,0,0,1,0}}; //将国家放进二维数组中。相邻的国家标1,不相邻标0
int c[]=new int[n]; //用来存储每个国家涂的颜色
c[0]=1; //第一个国家着第一种颜色
int i=1; //从第二个国家开始试探颜色
int j=1; //从第一种颜色开始给后面的国家试探着色
int k; //k表示一个中间变量,赋初值0
while(i<n)
while(j<=4)
{
k=0;
while(k<i && c[k]*r[i][k]!=j) //判断颜色是否被用过
k=k+1;
if(k<i)
j=j+1; //当颜色被用过
else
{
c[i]=j;
i=i+1;
if(i>6) //全部满足条件,退出循环
break;
j=1;
}
if(j>4) //当4种颜色都不满足时,回溯
{
i=i-1;
j=c[i]+1;
}
}
System.out.println("着色方案如下:");
for(i=0;i<n;i++)
System.out.print(c[i]);
}
}
结果:
着色方案如下:
1213132