package algoSpot.PICNIC;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
/**
* Created by eunbi on 2018-02-05.
* /
public class PICNIC_EB_list {
public static StringBuilder sb = new StringBuilder();
public static Scanner sc = new Scanner(System.in);
public static int C;
public static int count;
public static int N;
public static int M;
public static boolean[][] freindsMap;
public static void main(String[] args) throws Exception{
//Test Case
C=sc.nextInt();
for(int i=0;i<C;i++) {
solve();
}
System.out.println(sb.toString());
sc.close();
}
public static void solve() throws Exception{
// N, M 설정
N = sc.nextInt();
M = sc.nextInt();
//초기화
count =0;
boolean[] checkList = new boolean[N];
for (int i = 0; i < N; i++) {
checkList[i] = false;
}
initMap();
// input값을 이차원 배열에 삽입
for (int i = 0; i < M; i ++) {
freindsMap[sc.nextInt()][sc.nextInt()] = true;
}
//해당 함수 호출
picnic(checkList);
//sb 에 결과 저장
sb.append(count).append("\n");
// System.out.println(sb.toString());
}
public static void print() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(freindsMap[i][j] + " ");
}
System.out.println();
}
}
public static void picnic(boolean[] checkList) {
//다음 n, 즉 false를 찾는다.
int n=0;
while (n<N&&checkList[n]){
n++;
}
//모두 true일 때 : 기저, return
if(n==N) {
count++;
return;
}
//n에 해당하는 친구 리스트 설정
boolean[] isfriend = freindsMap[n];
// 친구인지 검사
for(int i=0;i<N;i++){
// 친구이면서, 짝이 없는 아이
if(isfriend[i] && !checkList[i]){
/* boolean[] tempck = checkList.clone();
tempck[i] = true;
tempck[n] = true;*/
checkList[i] = checkList[n] = true;
picnic(checkList);
checkList[i] = checkList[n] = false;
}
}
}
public static void initMap() {
freindsMap = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
freindsMap[i][j] = false;
}
}
}
}
다른시도
노드라는 객체를 만들어서, false인것끼리 객체를 묶는 형식이다.
객체가 N/2개 묶이면 return
주의해야 할 점은
순서가 뒤바뀌는 경우가 생기는데
팩토리얼을 구해서 나누어주면 된다.
이것도 sc로 바꾸니까 정답처리 나왓다.
왜 고생햇지
함수의 result값은 테스트를 위해 출력하는 값이다. 실제 코드는 지우면 된다.
package algoSpot.PICNIC;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Created by eunbi on 2018-02-05.
*/
public class PICNIC_EB_node {
public static StringBuilder sb = new StringBuilder();
public static Scanner sc = new Scanner(System.in);
public static int C;
public static int count=0;
public static int N;
public static int M;
//public static int[][] freindsMap;
public static List<Node> nodeList = new ArrayList<Node>();
public static void main(String[] args) throws Exception{
C=sc.nextInt();
for(int i=0;i<C;i++) {
solve();
}
System.out.println(sb.toString());
sc.close();
}
public static void solve() throws Exception {
N = sc.nextInt();
M = sc.nextInt();
nodeList = new ArrayList<Node>();
count = 0;
boolean[] checkList = new boolean[N+1];
for (int i = 0; i < N; i++) {
checkList[i] = false;
}
for (int i = 0; i < M; i ++) {
nodeList.add(new Node(sc.nextInt(), sc.nextInt()));
}
System.out.println(nodeList);
for (Node node : nodeList) {
boolean[] tempck = checkList.clone();
tempck[node.a] = true;
tempck[node.b] = true;
picnic(tempck, 1, node.toString());
}
int divid =combination();
//int divid = (int)Math.pow(2,N/2);
sb.append(count / divid).append("\n");
// System.out.println(count +"/"+ divid);
}
public static void picnic(boolean[] checkList, int num, String result) throws Exception{
// 쌍을 모두 찾음
if(num == N/2){
System.out.println(result);
count++;
return;
}
for(int i=0;num<N/2&&i<nodeList.size();i++){
Node node = nodeList.get(i);
if(!checkList[node.a] &&!checkList[node.b]){
boolean[] tempck = checkList.clone();
tempck[node.a] = true;
tempck[node.b] = true;
picnic(tempck, num+1 ,result+node);
}
}
}
public static int combination(){
int result=1;
for(int i=1;i<=N/2;i++){
result *= i;
}
return result;
}
public static class Node {
int a;
int b;
public Node(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public String toString() {
return "(" +
a +
", " + b +
')';
}
}
}
'Develope > 알고리즘' 카테고리의 다른 글
[백준 14891] 톱니바퀴 - java (0) | 2018.02.12 |
---|---|
[알고스팟] BOARDCOVER - java (0) | 2018.02.12 |
[백준 - 1158] 조세퍼스 문제 (0) | 2018.01.04 |
[백준 - 2140] 지뢰찾기 (0) | 2017.12.19 |
[알고스팟] XHAENEUNG (5) | 2017.12.11 |