자료구조,알고리즘

(알고리즘)m-coloring 문제해결

코딩 공부중 2019. 2. 11. 21:24
import java.util.*;

public class coloring {
	private int n;
	private int m;
	private int W[][];
	private int vcolor[];
	
	coloring(int count, int color_number){
		int i, j; // for loop
		char is_true;
		Scanner sc = new Scanner(System.in);
		n = count;
		m = color_number;
		W = new int[n][n];
		vcolor = new int[n];
		vcolor[0] = 1;
		for ( i = 1 ; i <= n ; i++ ){
			for ( j = 1 ; j <= n ; j++ ){
				W[i-1][j-1] = 0;
			}
		}
		for ( i = 1 ; i <= n ; i++ ){
			for ( j = i ; j <= n ; j++ ){
				if ( j == i ) continue;
				System.out.print(i + "노드와 " + j + "노드는 인접한가?(y/n)");
				String input = sc.next();
				is_true = input.charAt(0);
				if ( is_true == 'y' ){
					W[i-1][j-1] = 1; 
					W[j-1][i-1] = 1;
				}
			}
		}
	}
	
	private boolean promising(int i){
		int j = 0;
		boolean stc = true;
		
		while ( j < i && stc ){
			if( W[i][j] == 1 && vcolor[i] == vcolor[j] ) stc = false;
			j++;
		}
		return stc;
	}
	
	public void m_coloring(int i){
		int color;
		if ( promising(i) )
			if ( i == n-1 ){
				print_color();
			}else{
				for ( color = 1; color <= m ; color++ ){
					vcolor[i+1] = color;
					m_coloring(i+1);
				}
			}
	}
	
	public void print_color(){
		System.out.println("\n정답");
		for ( int j = 0 ; j < n ; j++ ){
			System.out.println((j+1) + "번재 노드의 색은 : " + vcolor[j] );
		}
	}
 
	public static void main(String[] args){
		int color, n;
		Scanner sc = new Scanner(System.in);
		System.out.print("정점의 개수 입력 : ");
		n = sc.nextInt();
		System.out.print("색깔의 개수 입력 : ");
		color = sc.nextInt();
		
		coloring c = new coloring(n,color);
		c.m_coloring(0);
	}
}