LCCUP第三题弹珠游戏总结,附完整代码

LCCUP第三题弹珠游戏总结,附完整代码

  • if语句非必要不要将条件分段写,分段写可能会导致出现某些特殊情况时,代码出现莫名bug(这题我因为分段写导致dfs函数中途退出从而漏掉了某些结果)
  • 写伪代码时一定要考虑好题目所给的条件,将限制条件全部考虑进去
  • 理清代码运行逻辑,例如此题是先进行判断然后根据结果修改目标的方向
  • 考虑数组边界的问题,理清数组边界可能的几种状态
class Solution {
    List<Integer> l;
    public int[][] ballGame(int num, String[] plate) {
        int m = plate.length,n = plate[0].length();
        Character[][] nums = new Character[m][n];
        List<Integer> tmp = new ArrayList<>();
        for (int i = 0;i < m;i++){
            for (int j = 0;j < n;j++){
                nums[i][j] = plate[i].charAt(j);
                if (nums[i][j] == 'O'){
                    tmp.add(i);
                    tmp.add(j);
                }
            }
        }
        l = new ArrayList<>();
        for (int i = 0;i < tmp.size();i += 2){
            dfs(nums,tmp.get(i) - 1,tmp.get(i + 1),"up",1,num);
            dfs(nums,tmp.get(i) + 1,tmp.get(i + 1),"down",1,num);
            dfs(nums,tmp.get(i),tmp.get(i + 1) - 1,"left",1,num);
            dfs(nums,tmp.get(i),tmp.get(i + 1) + 1,"right",1,num);
        }
        int[][] res = new int[l.size() / 2][2];
        for (int i = 0,j = 0;i < res.length;i++,j += 2){
            res[i][0] = l.get(j);
            res[i][1] = l.get(j + 1);
        }
        return res;

    }
    void dfs(Character[][] nums,int m,int n,String direction,int step,int num){
        if (m < 0 || m > nums.length - 1 || n < 0 || n > nums[0].length - 1){
            return;
        }
        if (step <= num && nums[m][n] != 'O' && nums[m][n] != 'W' && nums[m][n] != 'E' && ((n == 0 && direction.equals("left") && m > 0 && m < nums.length - 1) || (m == 0 && direction.equals("up") && n > 0 && n < nums[0].length - 1) || (m == nums.length - 1 && direction.equals("down") && n > 0 && n < nums[0].length - 1) || (n == nums[0].length - 1 && direction.equals("right") && m > 0 && m < nums.length - 1))){
                l.add(m);
                l.add(n);
            return;
        }
        if (step > num){
            return;
        }
        if (m < 0 || m > nums.length - 1 || n < 0 || n > nums[0].length - 1){
            return;
        }
        if (nums[m][n] == 'O'){
            return;
        }
        if (nums[m][n] == 'W'){
            switch (direction){
                case "left":
                        dfs(nums,m - 1,n,"up",step + 1,num);
                    break;
                case "right":
                        dfs(nums,m + 1,n,"down",step + 1,num);
                    break;
                case "up":
                        dfs(nums,m,n + 1,"right",step + 1,num);
                    break;
                case "down":
                    dfs(nums,m,n - 1,"left",step + 1,num);
                    break;
            }
        } else if (nums[m][n] == 'E'){
            switch (direction){
                case "left":
                    dfs(nums,m + 1,n,"down",step + 1,num);
                    break;
                case "right":
                    dfs(nums,m - 1,n,"up",step + 1,num);
                    break;
                case "up":
                    dfs(nums,m,n - 1,"left",step + 1,num);
                    break;
                case "down":
                    dfs(nums,m,n + 1,"right",step + 1,num);
                    break;
            }
        } else if (nums[m][n] == '.'){
            switch (direction){
                case "left":
                    dfs(nums,m,n - 1,"left",step + 1,num);
                    break;
                case "right":
                    dfs(nums,m,n + 1,"right",step + 1,num);
                    break;
                case "up":
                    dfs(nums,m - 1,n,"up",step + 1,num);
                    break;
                case "down":
                    dfs(nums,m + 1,n,"down",step + 1,num);
                    break;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值