-
Notifications
You must be signed in to change notification settings - Fork 0
/
Robbed.java
114 lines (105 loc) · 2.7 KB
/
Robbed.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public class Robbed {
int[] rdelta = {-1, 0, 0, 1};
int[] cdelta = {0, -1, 1, 0};
public int countRoutes(String[] maze){
int count = 0;
int[] rc = findPos(maze);
int r = rc[0];
int c = rc[1];
int rowCash = rc[2];
int colCash = rc[3];
char[][] matrix = new char[maze.length][maze[0].length()];
for (int i=0; i<maze.length; i++){
for (int j=0; j<maze[0].length(); j++){
matrix[i][j] = maze[i].charAt(j);
}
}
char[][] matrixCopy = matrix;
for (int k=0; k<rdelta.length; k++){
if ((r+rdelta[k])>=0 && (r+rdelta[k])<maze.length && (c+cdelta[k])>=0 && (c+cdelta[k])<maze[0].length()){
if (distance(r+rdelta[k], c+cdelta[k], rowCash, colCash) <= distance(r, c, rowCash, colCash)){
//-- check win conditions
if (maze[r+rdelta[k]].charAt(c+cdelta[k])=='C') {
count++;
}
else if (maze[r+rdelta[k]].charAt(c+cdelta[k]) == 'X'){
continue;
}
else{
matrixCopy[r][c] = '.';
matrixCopy[r+rdelta[k]][c+cdelta[k]] = 'R';
count += countRoutes(matrixCopy);
matrixCopy[r][c] = 'R';
matrixCopy[r+rdelta[k]][c+cdelta[k]] = '.';
}
}
}
}
return count;
}
public int countRoutes(char[][] maze){
int count = 0;
char[][] mazeCopy = maze;
int[] rc = findPos(maze);
int r = rc[0];
int c = rc[1];
int rowCash = rc[2];
int colCash = rc[3];
for (int k=0; k<rdelta.length; k++){
if ((r+rdelta[k])>=0 && (r+rdelta[k])<maze.length && (c+cdelta[k])>=0 && (c+cdelta[k])<maze[0].length){
if (distance(r+rdelta[k], c+cdelta[k], rowCash, colCash) <= distance(r, c, rowCash, colCash)){
//-- check win conditions
if (maze[r+rdelta[k]][c+cdelta[k]]=='C') {
count++;
}
else if (maze[r+rdelta[k]][c+cdelta[k]] == 'X'){
continue;
}
else{
mazeCopy[r][c] = '.';
mazeCopy[r+rdelta[k]][c+cdelta[k]] = 'R';
count +=countRoutes(mazeCopy);
mazeCopy[r][c] = 'R';
mazeCopy[r+rdelta[k]][c+cdelta[k]] = '.';
}
}
}
}
return count;
}
public int[] findPos(String[] maze){
int[] rc = new int[4];
for (int i=0; i<maze.length; i++){
for (int j=0; j<maze[0].length(); j++){
if (maze[i].charAt(j) == 'R'){
rc[0] = i;
rc[1] = j;
}
if (maze[i].charAt(j) == 'C'){
rc[2] = i;
rc[3] = j;
}
}
}
return rc;
}
public int[] findPos(char[][] maze){
int[] rc = new int[4];
for (int i=0; i<maze.length; i++){
for (int j=0; j<maze[0].length; j++){
if (maze[i][j] == 'R'){
rc[0] = i;
rc[1] = j;
}
if (maze[i][j] == 'C'){
rc[2] = i;
rc[3] = j;
}
}
}
return rc;
}
public double distance(int r1, int c1, int r2, int c2){
return Math.sqrt((c2-c1)*(c2-c1) + (r2-r1)*(r2-r1));
}
}