昔よくやったあそび

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

昔よくやったあそび

投稿記事 by GRAM » 14年前

自分が小学生のころみんなで集まってやる遊びといえば「盗探」(もしくは警泥、泥警という地域も)が一番エキサイティングしていました(山の方に住んでいるので)
さてこれをやるときは自分の場合捕まえることより逃げることの方が好きだったのですが、どうも位置をつかむのが難しい…
全員で足を片方ずつ出して、(どれにしようかなの要領で)順番に盗人と探偵を決めていくのですが、一回決めるごとに一人ずつ減っていくので自分には暗算では無理。
ということで今さらだが、昔の悩みを晴らすべく盗人と探偵をはじき出すプログラムを作ってみる。

…と思っていたがどうやら事程度の問題は過去にもう解いている人間がいるようです。
「ジョセファスの問題」というものの類題のようですね。
リングリストをつかうと素直に解けるという事なので作ってみる

CODE:

#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

ああ
記事: 49
登録日時: 14年前

Re: 昔よくやったあそび

投稿記事 by ああ » 14年前

泥警懐かしいw

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

Re: 昔よくやったあそび

投稿記事 by GRAM » 14年前

しまった!
firstNodeとtempに0を代入してない!
・・・まだまだか。