2009年03月25日

[パズル]七対子

  
前回、清一色かどうかを調べるコードの中で、七対子かどうかを調べる部分がありました。
再度掲載します。

 private bool Is7Pair(List<int> nums) {
if (nums.Count() == 0)
return true;
for (int i = 1; i <= 9; i++) {
if (nums.FindAll(n => n == i).Count >= 2) {
2.Times(() => nums.Remove(i));
try {
if (Is7Pair(nums))
return true;
} finally {
2.Times(() => nums.Add(i));
}
}
}
return false;
}


かなり、複雑です。この部分が気になったので、もう少し考えてみました。
事前にソートしておけば、もっと簡単になりますね。

 private bool Is7Pair(List<int> nums) {
return IsPair7Inner(nums.OrderBy(n => n));
}

private bool IsPair7Inner(IEnumerable<int> nums) {
if (nums.Count() == 0)
return true;
if (nums.ElementAt(0) != nums.ElementAt(1))
return false;
return IsPair7Inner(nums.Skip(2));
}


再帰処理のお手本のようなコードになったと思います。


 

この記事へのトラックバックURL