迷路作成の際の最後に、しらみつぶしで残りの領域を探索します。 そのためにスタックを使用すると便利です。 参考までに、私の作ったスタックプログラムを置いておきます。 特徴としては、同時に最大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; } |