中级农民
- 积分
- 102
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-12-22
- 最后登录
- 1970-1-1
|
个人的简单backtracking解法:
- public class Moive {
- /*
- 给一串movie,假定每个movie都是一个小时,并且都在整点播放;给你一个List的movies,让你安排播放时间,如果没有答案throw一个exception。
- 比如
- 电影A: 14, 15, 16, 17
- 电影B: 14, 15, 16
- 电影C: 14, 15
- 电影D: 14, 15, 17
- 返回一个解就行,比如 A 14, B 16, C 15, D 17。 如果你要 A 14, B 15, 后面 C就没法看了.
- */
- class MoviePlay{
- String name;
- int time;
- public MoviePlay(String name, int time){
- this.name = name;
- this.time = time;
- }
- public String toString(){
- return name + ":" + time;
- }
- }
- public List<MoviePlay> arrange(Map<String, List<Integer>> movies) throws Exception{
- List<MoviePlay> rlt = new ArrayList<>();
- if(helper(rlt, new HashSet<>(), movies, new ArrayList<>(movies.keySet()), 0)) return rlt;
- throw new Exception("No valid arrangement");
- }
- public boolean helper(List<MoviePlay> rlt, Set<Integer> timeTaken, Map<String, List<Integer>> times, List<String> movieList, int index){
- if(index == movieList.size()) return true;
- String movie = movieList.get(index);
- List<Integer> playtime = times.get(movie);
- for(Integer time: playtime){
- if(!timeTaken.contains(time)){
- timeTaken.add(time);
- rlt.add(new MoviePlay(movie, time));
- if(helper(rlt, timeTaken, times, movieList, index + 1)) return true;
- rlt.remove(rlt.size()-1);
- timeTaken.remove(time);
- }
- }
- return false;
- }
- public static void main(String[] args){
- Map<String, List<Integer>> movies = new HashMap<>();
- movies.put("A", new ArrayList());
- movies.put("B", new ArrayList());
- movies.put("C", new ArrayList());
- movies.put("D", new ArrayList());
- movies.get("A").addAll(Arrays.asList(14, 15, 16, 17));
- movies.get("B").addAll(Arrays.asList(14, 15));
- movies.get("C").addAll(Arrays.asList(14, 15));
- movies.get("D").addAll(Arrays.asList(14, 15, 16, 17));
- Moive m = new Moive();
- try{
- List<MoviePlay> rlt = m.arrange(movies);
- System.out.println(rlt);
- }catch (Exception e){
- e.printStackTrace();
- }
- }
- }
复制代码 |
|