private void init(List<String> problemDefinition) throws Exception {
		//validation
		if(problemDefinition == null || problemDefinition.size() == 0){
			throw new Exception("problem definition is invalid!");
		}
		
		Pattern intPattern = Pattern.compile("\\d+");
		Matcher matcher = intPattern.matcher(problemDefinition.get(0));
		
		if(matcher.find()){
			String sN = matcher.group();
			this.N = Integer.parseInt(sN);
		}
		if(matcher.find()){
			String sMaxMinutes = matcher.group();
			this.maxMinutes = Integer.parseInt(sMaxMinutes);
		}
		if(this.N <= 0 || this.maxMinutes <= 0){
			throw new Exception("N or max_minutes is invalid!");
		}
		
		HashSet<Integer> peopleAtWest = new HashSet<Integer>();
		for(int pos = 2; pos < this.N + 2 && pos < problemDefinition.size(); pos++){
			String person = problemDefinition.get(pos);
			Integer p = Integer.parseInt(person);
			if(!peopleAtWest.add(p)){
				System.out.println("people times should be unique!");
			}
		}
		
		//end validation
		
		IState initial = new BridgeCrossingState(new Action(), peopleAtWest, new HashSet<Integer>()); 
		this.first = makeChild(null, new Action(), initial);
	}