TopCoder SRM 590:FoxAndChess
- begin, target の '.' 以外の文字(LR)を左から突き合わせる
- 文字や長さが一致しなかったら、
"Impossible"
- あとは移動前後の位置関係が矛盾しているかを判定する
本番だと Where(...).Select((c, index) => index)
としてしまって、フィルタ後の添え字を返してハマっていた。
こういう添字を返す場合はおとなしく Enumerable.Range
を使ったほうがよさそう。
public class FoxAndChess { public string ableToMove(string begin, string target) { var x = begin; int n = begin.Length; if (begin.Replace(".", "") != target.Replace(".", "")) return "Impossible"; string symbols = begin.Replace(".", ""); var beginPositions = begin.Select((c, index) => index).Where(index => begin[index] != '.').ToArray(); var targetPositions = target.Select((c, index) => index).Where(index => target[index] != '.').ToArray(); for (int i = 0; i < beginPositions.Length; i++) { char c = symbols[i]; if (c == 'L' && beginPositions[i] < targetPositions[i]) return "Impossible"; if (c == 'R' && beginPositions[i] > targetPositions[i]) return "Impossible"; } return "Possible"; } }