【672. 灯泡开关 Ⅱ】状态空间缩小

//只需要考虑前6位的状态,i这种状态和i+6这个状态是一样的

import
java.util.ArrayDeque; import java.util.Arrays; import java.util.HashSet; class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.flipLights(3,2)); } public int flipLights(int n, int presses) { n = Math.min(n,6); char[] arr = new char[n]; for (int i = 0; i < n; i++) { arr[i] = '1'; } ArrayDeque<char[]> deque = new ArrayDeque<>(); deque.add(arr); int step = 0; while (!deque.isEmpty() && step < presses) { ArrayDeque<char[]> nextDeque = new ArrayDeque<>(); step++; HashSet<String> set = new HashSet<>(); while(!deque.isEmpty()){ char[] state = deque.poll(); char[] newState = new char[n]; for (int i = 0; i < n; i++) { newState[i] = state[i] == '1' ? '0' : '1'; } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } for (int i = 0; i < n; i++) { if (i % 2 == 1) { newState[i] = state[i]; } else { newState[i] = state[i] == '1' ? '0' : '1'; } } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } for (int i = 0; i < n; i++) { if (i % 2 == 0) { newState[i] = state[i]; } else { newState[i] = state[i] == '1' ? '0' : '1'; } } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } for (int i = 1; i <= n; i++) { if (i % 3 != 1) { newState[i - 1] = newState[i - 1]; } else { newState[i - 1] = newState[i - 1] == '1' ? '0' : '1'; } } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } } deque = nextDeque; } return deque.size(); } }

 

posted @ 2022-06-06 17:09  fishcanfly  阅读(30)  评论(2)    收藏  举报
//雪花飘落效果