package com.interview.algorithms.string;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created_By: stefanie
* Date: 14-8-26
* Time: 下午3:54
*/
public class C11_22_FindCombinationWithRules {
public int N;
public Map<Integer, Integer[]> placeMap;
public Map<Integer, Integer[]> neighborMap;
public C11_22_FindCombinationWithRules(int n, Map<Integer, Integer[]> placeMap, Map<Integer, Integer[]> neighborMap) {
this.N = n;
this.placeMap = placeMap;
this.neighborMap = neighborMap;
}
public List<String> find(){
List<String> combinations = new ArrayList<String>();
find(combinations, null, "", 1);
return combinations;
}
private void find(List<String> combinations, Integer last, String prefix, int idx){
if(prefix.length() == N) {
combinations.add(prefix);
return;
}
Integer[] blocks = placeMap.get(idx);
Integer[] neighbor = last == null? null : neighborMap.get(last);
for(int i = 1; i <= N; i++){
if(blocks != null && blocks.length > 0 && !canPlace(i, blocks)) continue;
if(neighbor != null && neighbor.length > 0 && !canPlace(i, neighbor)) continue;
if(prefix.contains(i+"")) continue;
find(combinations, i, prefix + i, idx + 1);
}
}
private boolean canPlace(Integer i, Integer[] blocks){
for(Integer block : blocks)
if(i == block) return false;
return true;
}
}