(これはCSクラスの宿題のように見えますが、CSクラスの宿題ではありません)
0 から 22 までの範囲を表すためにビットフィールドを使用しています。たとえば、入力としていくつかの異なる範囲があります (順序は関係ありません)。読みやすくするために.
for0
とX
forを使用しました。1
.....XXXXX..............
..XXXX..................
.....XXXXXXXXXXXXXXX....
........XXXXXXX.........
XXXXXXXXXXXXXXXXXXXXXXXX
通常、ビットフィールド範囲の数は 10 未満ですが、潜在的に 100 になる可能性があります。その入力から、次のように、相互に排他的な連続した範囲を計算したいと思います。
XX......................
..XXX...................
.....X..................
......XX................
........XX..............
..........XXXXX.........
...............XXXXX....
....................XXXX
(繰り返しますが、出力順序は重要ではありません。相互に排他的で連続している必要があります。つまり、穴があっては.....XXX.......XXXXX....
なりません。2 つの個別の範囲に分割する必要があります)。
いくつかのアルゴリズムを試しましたが、いずれもかなり複雑で洗練されていません。私が非常に役立つの.....XXX.......XXXXX....
は、穴があることを検出する方法と、穴内のビットの 1 つのインデックスを決定する方法です。
編集:ビットフィールドの範囲は、マップ上のズームレベルを表します。これらは、Mapnik (特に OpenStreetMap で使用されるタイル レンダリング システム) の XML スタイルシートを出力するために使用することを目的としています。