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;
}
}
}
}