求助丨dfs的一道题,哪位大神可以帮我看看,看了一个小时了,不知道啥原因
624
2024.09.21
2024.09.21
发布于 广东

简介

LCP 63. 弹珠游戏
欢迎各位来到「力扣嘉年华」,接下来将为各位介绍在活动中广受好评的弹珠游戏。

N*M 大小的弹珠盘的初始状态信息记录于一维字符串型数组 plate 中,数组中的每个元素为仅由 "O"、"W"、"E"、"." 组成的字符串。其中:

"O" 表示弹珠洞(弹珠到达后会落入洞中,并停止前进);
"W" 表示逆时针转向器(弹珠经过时方向将逆时针旋转 90 度);
"E" 表示顺时针转向器(弹珠经过时方向将顺时针旋转 90 度);
"." 表示空白区域(弹珠可通行)。
游戏规则要求仅能在边缘位置的 空白区域 处(弹珠盘的四角除外)沿 与边缘垂直 的方向打入弹珠,并且打入后的每颗弹珠最多能 前进 num 步。请返回符合上述要求且可以使弹珠最终入洞的所有打入位置。你可以 按任意顺序 返回答案。

注意:

若弹珠已到达弹珠盘边缘并且仍沿着出界方向继续前进,则将直接出界。
示例 1:

输入: num = 4 plate = ["..E.",".EOW","..W."]

输出:[[2,1]]

https://leetcode.cn/problems/EXvqDp/

[https://leetcode.cn/problems/EXvqDp/](https://leetcode.cn/problems/EXvqDp/)

class Solution {
int [][]dir={{0, 1},{1, 0},{0, -1},{-1,0}};// 右 下 左 上 (顺时针)
int num;
String[]plate;
int n,m;
List<List>res;

public boolean dfs (int i ,int j ,int a){
   int left = num; 
//    var r=new ArrayList<Integer>();
while(plate[i].charAt(j)!='0'){
   
    if(left==0) return false;
    if(plate[i].charAt(j)=='W'){
        a=(a+3)%4;
    }
     if(plate[i].charAt(j)=='E'){
        a=(a+1)%4;
    }
    i=i+dir[a][0];
    j=j+dir[a][1];
    if(i<0||j<0||j>n-1||i>m-1)return false;
    left--;

}
return true;
// r.add(i);
// r.add(j);
// res.add(r);

}
public int[][] ballGame(int num, String[] plate) {
     this.num = num;
    this.plate=plate;
    this.m= plate.length;
    this.n=plate[0].length();
    this.res=new ArrayList<>();
    var r=new ArrayList<Integer>();
    for(int i=1;i<n-1;i++ ){
        if(plate[0].charAt(i)=='.'&&dfs(0,i,1)){
             
             r.add(0);
             r.add(i);
             res.add(r);
        }
        if(plate[m-1].charAt(i)=='.'&&dfs(m-1,i,3)){
             r.clear();
             r.add(m-1);
             r.add(i);
             res.add(r);
        }
       
    }
    for(int i=1;i<m-1;i++){
        if(plate[i].charAt(0)=='.'&&dfs(i,0,0)){
            r.clear();
             r.add(i);
             r.add(0);
             res.add(r);
        } 
        if(plate[i].charAt(n-1)=='.'&&dfs(i,n-1,2)){
                r.clear();
             r.add(i);
             r.add(n-1);
             res.add(r);
        }
        
    }
     int[][] res1 = res.stream()
                     .map(l -> new int[]{l.get(0), l.get(1)}) // 将每个 List<Integer> 转换为 int[]
                     .toArray(int[][]::new); 
    return res1;
}

}

评论 (2)