LCP 63. 弹珠游戏
欢迎各位来到「力扣嘉年华」,接下来将为各位介绍在活动中广受好评的弹珠游戏。
N*M 大小的弹珠盘的初始状态信息记录于一维字符串型数组 plate 中,数组中的每个元素为仅由 "O"、"W"、"E"、"." 组成的字符串。其中:
"O" 表示弹珠洞(弹珠到达后会落入洞中,并停止前进);
"W" 表示逆时针转向器(弹珠经过时方向将逆时针旋转 90 度);
"E" 表示顺时针转向器(弹珠经过时方向将顺时针旋转 90 度);
"." 表示空白区域(弹珠可通行)。
游戏规则要求仅能在边缘位置的 空白区域 处(弹珠盘的四角除外)沿 与边缘垂直 的方向打入弹珠,并且打入后的每颗弹珠最多能 前进 num 步。请返回符合上述要求且可以使弹珠最终入洞的所有打入位置。你可以 按任意顺序 返回答案。
注意:
若弹珠已到达弹珠盘边缘并且仍沿着出界方向继续前进,则将直接出界。
示例 1:
输入: num = 4 plate = ["..E.",".EOW","..W."]
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;
}}