迷路作成の際の最後に、しらみつぶしで残りの領域を探索します。 そのためにスタックを使用すると便利です。 参考までに、私の作ったスタックプログラムを置いておきます。 特徴としては、同時に最大4つの整数をプッシュ、ポップする事と、先頭のいくつかのデータをランダムに取り出せる事です。 利用は自由です。
C++のMyStackというクラスになっています。以下のメソッドというか関数を使えます。
//
// 迷路プログラム用
// スタック処理クラス、ヘッダファイル
// 2005/9/24 ISHIDA SO
//
#ifndef MYSTACKH
#define MYSTACKH
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#define MYSTACKDATASIZE 1000
extern int DummyVariable;
class MyStack {
private:
class MyStackMemory { // 実際にデータを保存する内部クラス。
public:
int mem[MYSTACKDATASIZE][4];
MyStackMemory *next;
public:
MyStackMemory() { next = NULL; };
~MyStackMemory() { if(next) delete next; };
};
MyStackMemory *data;
int NumberOfRecords;
public:
__fastcall MyStack() { data = NULL; NumberOfRecords = 0; };
__fastcall ~MyStack() { if(data) delete data; };
void Clear(void) { NumberOfRecords = 0; };
void Push(int d1, int d2=0, int d3=0, int d4=0);
bool Pop(int &d1, int &d2=DummyVariable, int &d3=DummyVariable, int &d4=DummyVariable);
bool PopRandom(int num, int &d1, int &d2=DummyVariable, int &d3=DummyVariable, int &d4=DummyVariable);
int Numbers(void) { return NumberOfRecords;};
};
#endif
|
//
// 迷路プログラム用
// スタック処理クラス、プログラム
// 2005/9/24 ISHIDA SO
//
#include "MyStack.h"
#include <stdio.h>
#include <stdlib.h>
int DummyVariable;
void MyStack::Push(int d1, int d2, int d3, int d4)
{
MyStackMemory **p = &data;
int l = NumberOfRecords;
while(1) {
if( *p == NULL) {
*p = new MyStackMemory();
if(*p == NULL) OutOfMemoryError();
}
if(l < MYSTACKDATASIZE) break;
p = &((*p)->next);
l -= MYSTACKDATASIZE;
}
(*p)->mem[l][0] = d1;
(*p)->mem[l][1] = d2;
(*p)->mem[l][2] = d3;
(*p)->mem[l][3] = d4;
NumberOfRecords++;
}
bool MyStack::Pop(int &d1, int &d2, int &d3, int &d4)
{
MyStackMemory **p = &data;
int l = NumberOfRecords-1;
if(l < 0) return false;
while(1) {
if(l < MYSTACKDATASIZE) break;
p = &((*p)->next);
l -= MYSTACKDATASIZE;
}
d1 = (*p)->mem[l][0];
d2 = (*p)->mem[l][1];
d3 = (*p)->mem[l][2];
d4 = (*p)->mem[l][3];
NumberOfRecords--;
return true;
}
bool MyStack::PopRandom(int num, int &d1, int &d2, int &d3, int &d4)
{
MyStackMemory **p = &data;
int l;
if(NumberOfRecords <= 0) return false;
if(num > NumberOfRecords) num = NumberOfRecords;
l = random(num);
if(l < 0) return false;
while(1) {
if(l < MYSTACKDATASIZE) break;
p = &((*p)->next);
l -= MYSTACKDATASIZE;
}
d1 = (*p)->mem[l][0];
d2 = (*p)->mem[l][1];
d3 = (*p)->mem[l][2];
d4 = (*p)->mem[l][3];
return true;
}
|
|
|