SRM 651 Div. 1 Easy: RobotOnMoon

解法

4方向いずれかを連打して壁に当たるなら、-1である。どれを連打しても壁に当たらない時は、連打できる最大数を求めておく。この最大数の範囲内であればどのように部分文字列を取られても死ぬことはない。

コード

public class RobotOnMoon {

	public int longestSafeCommand(String[] board) {
		char[][] map = new char[board.length][];
		for (int i = 0; i < map.length; i++) {
			map[i] = board[i].toCharArray();
		}

		int[][] dir = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };
		int[] start = new int[2];
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				if (map[i][j] == 'S') {
					start[0] = i;
					start[1] = j;
				}
			}
		}

		int commands = 0;
		for (int i = 0; i < dir.length; i++) {
			int x = start[0];
			int y = start[1];
			while (true) {
				x += dir[i][0];
				y += dir[i][1];
				if (x < 0 || y < 0 || x >= map.length || y >= map[0].length) {
					break;
				}
				if (map[x][y] == '#') {
					return -1;
				}
				commands++;
			}
		}

		return commands;
	}

}