地图着色问题 --- java(BFS)

 已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。

public class Map {
	
	private static final int BOARD_NUMBER = 31;
    private String[] board = new String[BOARD_NUMBER];
    private int[][] edge = new int[BOARD_NUMBER][BOARD_NUMBER];
    //初始化所有顶点均涂色0
    private int[] color = new int[BOARD_NUMBER];
    
    public Map(String[] board, int[][] edge) {
        this.board = board;
        this.edge = edge;
    }
    
    public boolean colour(int colorKind) {
    	int vertex = 0;    //从图中的一个顶点开始
    	//vertex从0~BOARD_NUMBER-1表示所有顶点
    	while(vertex < BOARD_NUMBER) {
    		int flag = 1;
    		//如果发现colorKind种颜色不能满足,返回false
    		if(vertex == -1) {
    			return false;
    		}
    		color[vertex]++;
    		//当涂色超过colorKind种,回溯
    		if(color[vertex] > colorKind) {
    			color[vertex] = 0;
    			vertex--;
    			continue;
    		}
    		for(int i = 0; i < vertex; ++i) {
    			//发现邻接点涂相同颜色
    			if (edge[vertex][i] == 1 && color[vertex] == color[i]) {
                    flag = 0;
                    break;
                }
    		}
    		//发现邻接点涂相同颜色,该结点重涂
    		if(flag == 0) continue;
    		vertex++;
    	}
    	for(int i = 0; i < BOARD_NUMBER; ++i) {
    		System.out.println(board[i] + "涂色为:" + color[i]);
    	}
    	return true;
    }
	
	public static void main(String[] args) {
		String board[]={"广西","广东","云南","贵州","湖南","江西","福建","浙江","安徽","湖北","重庆","四川","西藏","青海",
	     "新疆","甘肃","陕西","宁夏","内蒙","北京","黑龙江","吉林","辽宁","天津","河北","山西","河南","江苏","山东","上海","海南","台湾","香港","澳门"};
		// 0、广西; 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、海南;
		// 用邻接矩阵建立图结构
		int edge[][]={
		 {0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {1,0,1,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {1,1,0,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,1,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0},
		 {0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0},
		 {0,0,0,0,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
		 {0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,1,1,0,0,0,0,0,0,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,1,0,1,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0},
		 {0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0},
		 {0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0},
		 {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0},
		 {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
		};
        Map p = new Map(board, edge);
        int colorKind = 1;
        while(!p.colour(colorKind)) {
        	colorKind++;
        }
        System.out.println("最少要涂" + colorKind + "种颜色");
    }
}

输出 

广西涂色为:1
广东涂色为:2
云南涂色为:2
贵州涂色为:3
湖南涂色为:4
江西涂色为:1
福建涂色为:3
浙江涂色为:2
安徽涂色为:3
湖北涂色为:2
重庆涂色为:1
四川涂色为:4
西藏涂色为:1
青海涂色为:2
新疆涂色为:3
甘肃涂色为:1
陕西涂色为:3
宁夏涂色为:2
内蒙涂色为:4
北京涂色为:1
黑龙江涂色为:1
吉林涂色为:2
辽宁涂色为:1
天津涂色为:2
河北涂色为:3
山西涂色为:1
河南涂色为:4
江苏涂色为:1
山东涂色为:2
上海涂色为:3
海南涂色为:1
最少要涂4种颜色
  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值