Next: Exercises Up: Unit 11 Previous: Moor: solution of the

## Moor: construction of the traversal

Besides checking the existence of a traversal, we also want to return such a traversal. Therefore, we realize a class Traversal that exports the following functionalities:

• construction of a traversal, given a moor; if the moor has at least one traversal, the constructed traversal should be one of these;
• return of the moor associated to a traversal;
• checking the existence of a traversal;
• return of the length of a traversal, if it exists;
• return of the i-th step of the traversal, where i is an integer between 0 and the length of the traversal minus one, if the traversal exists;
• return of a string representing a traversal, realized by overriding the toString() method of Object.

To represent a traversal, we exploit the fact that its length must be equal to C, i.e., equal to the number of columns of the moor, and that the zones that belong to the traversal are on successive columns, starting from 0 up to C - 1. Hence, we can use an array of C integer elements in which the value of the generic element of index c is equal to the index r of the row of zone < r, c > belonging to the traversal. For example, the traversal shown in moor 2 above is represented by the array `{`1,2,3,3,3,2`}`.

In the following implementation, we have chosen to add to the methods searchPath() and traverseMoor() an additional parameter, of type array of integers, that represents a path, and have the methods do side-effect by updating the path in an appropriate way. The implementation of the method toString() is left as an exercise.

```public class Traversal {

private int[] traversal;
private Moor moor;
private boolean found;

public Traversal(Moor m) {
moor = m;
traversal = new int[moor.getNumColumns()];
found = traverseMoor(moor, traversal);
}

public Moor moor() {
return moor;
}

public boolean existsTraversal() {
return found;
}

public int length() {
if (found)
return traversal.length;
else
throw new RuntimeException("Traversal: traversal does not exist");
}

public int step(int i) {
if (found)
return traversal[i];
else
throw new RuntimeException("Traversal: traversal does not exist");
}

public String toString() { ... }

// auxiliary methods

private static boolean traverseMoor(Moor m, int[] path) {
for (int row = 0; row < m.getNumRows(); row++)
if (searchTraversal(m, row, 0, path)) return true;
return false;
}

private static boolean searchTraversal(Moor m, int r, int c, int[] path) {
if (!m.land(r,c))
return false;
else {
path[c] = r;
if (c == m.getNumColumns()-1)
return true;
else
return searchTraversal(m, r-1, c+1, path) ||
searchTraversal(m, r,   c+1, path) ||
searchTraversal(m, r+1, c+1, path);
}
}
}
```

Next: Exercises Up: Unit 11 Previous: Moor: solution of the