さてこれをやるときは自分の場合捕まえることより逃げることの方が好きだったのですが、どうも位置をつかむのが難しい…
全員で足を片方ずつ出して、(どれにしようかなの要領で)順番に盗人と探偵を決めていくのですが、一回決めるごとに一人ずつ減っていくので自分には暗算では無理。
ということで今さらだが、昔の悩みを晴らすべく盗人と探偵をはじき出すプログラムを作ってみる。
…と思っていたがどうやら事程度の問題は過去にもう解いている人間がいるようです。
「ジョセファスの問題」というものの類題のようですね。
リングリストをつかうと素直に解けるという事なので作ってみる
#include
using namespace std;
class Node{ //リングリストを作るためのノード
public:
int num; //番号を記録
Node* nextNode; //次のノードを記録
Node(int n):num(n){} //番号を初期化するだけのコンストラクタ
};
int main(){
int k(1),n(0); //kは次に決めるのが盗人か探偵かを保存(1:盗人、0:探偵)
Node *firstNode, *temp; //一番最初のノードと現在のノードを一時的に保存しておくノードのポインタ
firstNode = temp = new Node(1); //最初のノードを作る
cout > n; //正の数を入力
if(n1000000) return -1;
for(int i=0; inextNode = new Node(i+2); //次のノードに新しいノードを追加
temp = temp->nextNode; //一次ノードを次のノードへ
}
temp->nextNode = firstNode; //最初に保存したノードを最後のノードの次に設定する
while(temp->nextNode != temp){ //次のノードが自分自身でない限り
if(k){ //次に決めるのが盗人なら
for(int i=0;inextNode;
}
Node* aboutToDelete = temp->nextNode; //いまから次のノードを削除する
temp->nextNode = aboutToDelete->nextNode; //現在のノードの次を削除するノードの次に
cout num nextNode;
}
Node* aboutToDelete = temp->nextNode; //以下同様
temp->nextNode = aboutToDelete->nextNode;
cout num num > k;
return 0;
}
…なんか夢がなくなったなOTL