蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举
从格子图的第一个格子开始,依次尝试放置 L、I、T、S 形状。在放置每个形状时,检查当前位置是否合法(是否在格子图范围内且没有被其他形状占据)。如果合法,我们就标记当前位置为已占据,并递归地尝试放置下一个形状。
void dfs(int step){ //此时在第step盒子面前,需要往里面放第i张扑克牌
for(int i=1;i<=n;i++){
if(book[i]==0){
//说明i号扑克牌还在手里,需要放入step号盒子
a[step]=i;//将i号扑克牌放到第step个盒子中
book[i]=1;//此时i号扑克牌已经被使用
dfs(step+1);
/*注意这里是自己调用自己,表示此时走到了第step+1个盒子面前*/
book[i]=0;
/*book[i]=0表示dfs调用结束了,换句话说就是扑克牌已经全部放完了
需要按照顺序将扑克牌收回,重新放,也就是前面所说的
*/
}
}
}
private static boolean check(int x, int y, int i, int j, int[][] map) {
int N = map.length;
for (int k = 0; k < 4; k++) {
int dx = x + lits[i][j][k][0];
int dy = y + lits[i][j][k][1];
if (dx < 0 || dy < 0 || dx >= N || dy >= N || map[dx][dy] != 1)
return false;
}
return true;
}