State ChokudaiSearch(State FirstState)
{
Heap<State>[] HStates = new Heap<State>[MaxTurn + 1];
for (int i = 0; i <= MaxTurn; i++) HStates[i] = new Heap<State>();
HStates[0].push(FirstState);
int ChokudaiWidth = 1; //通称chokudai幅
while (TimeCheck())
{
for (int t = 0; t < MaxTurn; t++)
{
for (int i = 0; i < ChokudaiWidth; i++)
{
if (HStates[t].top == null) break;
var NowState = HStates[t].pop();
foreach (var NextState in NowState.GetAllNextState())
{
HStates[t].push(NextState);
}
}
}
}
var BestState = HStates[0].pop();
return BestState;
}
ICAgIFN0YXRlIENob2t1ZGFpU2VhcmNoKFN0YXRlIEZpcnN0U3RhdGUpCiAgICB7CiAgICAgICAgSGVhcDxTdGF0ZT5bXSBIU3RhdGVzID0gbmV3IEhlYXA8U3RhdGU+W01heFR1cm4gKyAxXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBNYXhUdXJuOyBpKyspIEhTdGF0ZXNbaV0gPSBuZXcgSGVhcDxTdGF0ZT4oKTsKICAgICAgICBIU3RhdGVzWzBdLnB1c2goRmlyc3RTdGF0ZSk7CiAgICAgICAgaW50IENob2t1ZGFpV2lkdGggPSAxOyAvL+mAmuensGNob2t1ZGFp5bmFCiAgICAgICAgd2hpbGUgKFRpbWVDaGVjaygpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBNYXhUdXJuOyB0KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ2hva3VkYWlXaWR0aDsgaSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChIU3RhdGVzW3RdLnRvcCA9PSBudWxsKSBicmVhazsKICAgICAgICAgICAgICAgICAgICB2YXIgTm93U3RhdGUgPSBIU3RhdGVzW3RdLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBOZXh0U3RhdGUgaW4gTm93U3RhdGUuR2V0QWxsTmV4dFN0YXRlKCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBIU3RhdGVzW3RdLnB1c2goTmV4dFN0YXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIEJlc3RTdGF0ZSA9IEhTdGF0ZXNbMF0ucG9wKCk7CiAgICAgICAgcmV0dXJuIEJlc3RTdGF0ZTsKICAgIH0=