题目描述:
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
代码
import java.util.Arrays;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
System.out.println(new Solution().set.size());
}
}
class Solution {
int result = 0;
boolean[] isVisited = new boolean[13];
HashSet<String> set = new HashSet<>();
int[] path = new int[5];
public Solution() {
dfs(0);
}
public void dfs(int cnt){
if (cnt == 5) {
String str = "";
int[] clone = path.clone();
Arrays.sort(clone);
for (int j = 0; j < clone.length; j++) str += clone[j] + " ";
set.add(str);
return;
}
for (int i = 0; i < 12; i++) {
if (!isVisited[i] && check(cnt, i)) {
path[cnt] = i;
isVisited[i] = true;
dfs(cnt + 1);
isVisited[i] = false;
}
}
}
public static boolean isAdjoin(int x,int y){
if (x > y) return isAdjoin(y, x);
if(y - x == 4 || (y - x == 1 && y % 4!=0)) return true;
return false;
}
public boolean check(int x,int i){
if (x == 0) return true;
for (int j = 0; j < x; j++) {
if (isAdjoin(path[j], i)) return true;
}
return false;
}
}
题解
这道题 我先前没仔细考虑 认为就是到简单的回溯问题 于是就用了解决迷宫问题的思路 即走到一个位置后再向它四周走合适的位置
但写完后发现答案不对, 直到一遍遍的调试我发现这种思路没有办法覆盖到下面这些情况
即一个位置 通向多个方向, 因为之前的思路是只会在合适的位置选一个方向走, 走完了回来再换个方向, 所以不会出现这种分叉的情况
所以原来的方案就抛之不用
随之而来的就是再已经选中的块临近选块
方法是依次遍历所有块 再嵌套遍历选中的块, 测试其是否相邻
但还存在去重的问题: 不同起点开始可能得到相同答案
这时我们可以将得到的答案排序后转化城String存入set中, 相当于给每个不同的答案分配一个id
最后set的长度就是答案了
好的!本次分享到这就结束了
如果对铁汁你有帮助的话,记得点赞👍+收藏⭐️+关注➕
我在这先行拜谢了:)