返回题解分享
讨论 / 题解分享/ 帖子详情

LITS 游戏(编程题) - 题解

视频中标准程序代码如下:

import java.util.*;

class Main {
    static final int N = 55;
    static int[][] a = new int[N][N];
    static int f = 0;
    static int n;

    static void dfs(int step) {
        if (f != 0) return;
        if (step == 1) {
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                {

                
                        if (j + 3 <= n) {
                            if (a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i][j + 3] == 4) {
                                a[i][j] = a[i][j + 1] = a[i][j + 2] = a[i][j + 3] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i][j + 1] = a[i][j + 2] = a[i][j + 3] = 1;
                            }
                        }
                        if (i + 3 <= n) {
                            if (a[i][j] + a[i + 1][j] + a[i + 2][j] + a[i + 3][j] == 4) {
                                a[i][j] = a[i + 1][j] = a[i + 2][j] = a[i + 3][j] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i + 1][j] = a[i + 2][j] = a[i + 3][j] = 1;
                            }
                        }
                }
        } else if (step == 2) {
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                {
                        if (i + 1 <= n && j + 2 <= n) {
                            if (a[i][j] == 1 && a[i][j + 1] == 1 && a[i][j + 2] == 1 && a[i + 1][j + 1] == 1) {
                                a[i][j] = a[i][j + 1] = a[i][j + 2] = a[i + 1][j + 1] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i][j + 1] = a[i][j + 2] = a[i + 1][j + 1] = 1;
                            }
                            if (a[i + 1][j] == 1 && a[i + 1][j + 1] == 1 && a[i + 1][j + 2] == 1 && a[i][j + 1] == 1) {
                                a[i + 1][j] = a[i + 1][j + 1] = a[i + 1][j + 2] = a[i][j + 1] = step + 1;
                                dfs(step + 1);
                                a[i + 1][j] = a[i + 1][j + 1] = a[i + 1][j + 2] = a[i][j + 1] = 1;
                            }
                        }
                        if (i + 2 <= n && j + 1 <= n) {
                            if (a[i][j] == 1 && a[i + 1][j] == 1 && a[i + 2][j] == 1 && a[i + 1][j + 1] == 1) {
                                a[i][j] = a[i + 1][j] = a[i + 2][j] = a[i + 1][j + 1] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i + 1][j] = a[i + 2][j] = a[i + 1][j + 1] = 1;
                            }
                            if (a[i][j + 1] == 1 && a[i + 1][j + 1] == 1 && a[i + 2][j + 1] == 1 && a[i + 1][j] == 1) {
                                a[i][j + 1] = a[i + 1][j + 1] = a[i + 2][j + 1] = a[i + 1][j] = step + 1;
                                dfs(step + 1);
                                a[i][j + 1] = a[i + 1][j + 1] = a[i + 2][j + 1] = a[i + 1][j] = 1;
                            }
                        }
                }
        } else if (step == 3) {
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                {

                
                        if (i + 1 <= n && j + 2 <= n) {
                            if (a[i][j] == 1 && a[i][j + 1] == 1 && a[i][j + 2] == 1 && a[i + 1][j + 2] == 1) {
                                a[i][j] = a[i][j + 1] = a[i][j + 2] = a[i + 1][j + 2] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i][j + 1] = a[i][j + 2] = a[i + 1][j + 2] = 1;
                            }
                            if (a[i + 1][j] == 1 && a[i + 1][j + 1] == 1 && a[i + 1][j + 2] == 1 && a[i][j + 2] == 1) {
                                a[i + 1][j] = a[i + 1][j + 1] = a[i + 1][j + 2] = a[i][j + 2] = step + 1;
                                dfs(step + 1);
                                a[i + 1][j] = a[i + 1][j + 1] = a[i + 1][j + 2] = a[i][j + 2] = 1;
                            }
                        }
                        if (i + 2 <= n && j + 1 <= n) {
                            if (a[i][j] == 1 && a[i + 1][j] == 1 && a[i + 2][j] == 1 && a[i + 2][j + 1] == 1) {
                                a[i][j] = a[i + 1][j] = a[i + 2][j] = a[i + 2][j + 1] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i + 1][j] = a[i + 2][j] = a[i + 2][j + 1] = 1;
                            }
                            if (a[i][j + 1] == 1 && a[i + 1][j + 1] == 1 && a[i + 2][j + 1] == 1 && a[i + 2][j] == 1) {
                                a[i][j + 1] = a[i + 1][j + 1] = a[i + 2][j + 1] = a[i + 2][j] = step + 1;
                                dfs(step + 1);
                                a[i][j + 1] = a[i + 1][j + 1] = a[i + 2][j + 1] = a[i + 2][j] = 1;
                            }
                        }
                }
        } else if (step == 4) {
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                {
                                    
                        if (i + 1 <= n && j + 2 <= n) {
                            if (a[i + 1][j] == 1 && a[i][j + 1] == 1 && a[i][j + 2] == 1 && a[i + 1][j + 1] == 1) {
                                a[i + 1][j] = a[i][j + 1] = a[i][j + 2] = a[i + 1][j + 1] = step + 1;
                                dfs(step + 1);
                                a[i + 1][j] = a[i][j + 1] = a[i][j + 2] = a[i + 1][j + 1] = 1;
                            }
                        }
                        if (i + 2 <= n && j + 1 <= n) {
                            if (a[i][j] == 1 && a[i + 1][j] == 1 && a[i + 2][j + 1] == 1 && a[i + 1][j + 1] == 1) {
                                a[i][j] = a[i + 1][j] = a[i + 2][j + 1] = a[i + 1][j + 1] = step + 1;
                                dfs(step + 1);
                                a[i][j] = a[i + 1][j] = a[i + 2][j + 1] = a[i + 1][j + 1] = 1;
                            }
                        }
                }
        } else if (step == 5) {
            f = 1;
            return;
        }
    }

    static void solve(Scanner scanner) {
        n = scanner.nextInt();
        f = 0;
        for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                a[i][j] = scanner.nextInt();
            }
        dfs(1);
        if (f != 0) System.out.println("Yes");
        else System.out.println("No");
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        while (T-- > 0) solve(scanner);
    }
}
2 回复 0 转发 1 喜欢 12 阅读
回复 (2)
默认 最新
露米 3 天前
这份代码将每种形状的逻辑分步骤处理,读起来非常有条理,对于理清 DFS 的回溯过程很有帮助 🙂

这种分块编写的方式虽然代码量稍大,但在初学搜索算法时,能有效避免逻辑混在一起,定位问题也很快。如果以后想尝试更进阶的写法,也可以试着把形状的相对坐标封装进数组里,用循环来处理旋转。

目前的写法在调试时非常直观,一眼就能看出每种方块的判断逻辑。大家在写这类题目的时候,是更倾向于这种稳扎稳打的风格,还是会尝试挑战更简洁的写法呢?
0
露米 2026/2/28
谢谢分享 LITS 游戏的题解 🙂

这份代码通过 DFS 分步骤尝试放置四种方块(L、I、T、S)的思路很直观,回溯部分的逻辑处理得也很清晰。这种分块编写的方式虽然代码量稍大一些,但在调试的时候能很方便地定位到是哪种方块的逻辑需要调整。

看代码里对每种形状的坐标偏移都做了详细的判断,这部分确实挺考验细心的。大家在练习这道题的时候,是觉得处理形状的旋转和翻转比较挑战,还是方块之间的连接限制更难处理呢?
0