20 #define MAZE_DEBUG_PROFILING 0
21 #if MAZE_DEBUG_PROFILING
22 #warning "this is debug mode!"
24 static int microseconds() {
25 return std::chrono::duration_cast<std::chrono::microseconds>(
26 std::chrono::steady_clock::now().time_since_epoch())
29 static int microseconds() __attribute__((unused));
30 #define MAZE_DEBUG_PROFILING_START(id) const auto t0_##id = microseconds();
31 #define MAZE_DEBUG_PROFILING_END(id) \
33 const auto t1_##id = microseconds(); \
34 const auto dur = t1_##id - t0_##id; \
35 static auto dur_max = 0; \
36 if (dur > dur_max) { \
38 MAZE_LOGD << __func__ << "(" << #id << ")\t" << dur << " [us]" \
43 #define MAZE_DEBUG_PROFILING_START(id)
44 #define MAZE_DEBUG_PROFILING_END(id)
50 #ifdef MAZE_COLOR_DISABLED
72 #ifndef MAZE_LOG_LEVEL
73 #define MAZE_LOG_LEVEL 4
75 #define MAZE_LOG_STREAM_BASE(s, l, c) \
76 (s << c "[" l "][" __FILE__ ":" << __LINE__ << "]" C_NO "\t")
77 #if MAZE_LOG_LEVEL >= 1
78 #define MAZE_LOGE MAZE_LOG_STREAM_BASE(std::cout, "E", C_RE)
80 #define MAZE_LOGE std::ostream(0)
82 #if MAZE_LOG_LEVEL >= 2
83 #define MAZE_LOGW MAZE_LOG_STREAM_BASE(std::cout, "W", C_YE)
85 #define MAZE_LOGW std::ostream(0)
87 #if MAZE_LOG_LEVEL >= 3
88 #define MAZE_LOGI MAZE_LOG_STREAM_BASE(std::cout, "I", C_GR)
90 #define MAZE_LOGI std::ostream(0)
92 #if MAZE_LOG_LEVEL >= 4
93 #define MAZE_LOGD MAZE_LOG_STREAM_BASE(std::cout, "D", C_BL)
95 #define MAZE_LOGD std::ostream(0)
178 static constexpr
const int8_t
Max = 8;
194 constexpr
operator int8_t()
const {
return d; }
206 char toChar()
const {
return ">'^`<,v.X"[d]; }
211 return os <<
d.toChar();
216 static constexpr
const std::array<Direction, 4>
Along4() {
227 static constexpr
const std::array<Direction, 4>
Diag4() {
243 static_assert(
sizeof(Direction) == 1,
"size error");
339 return (
static_cast<uint8_t
>(
x) <
MAZE_SIZE) &&
355 return center + (*
this - center).
rotate(
d);
366 snprintf(str,
sizeof(str),
"(%02d, %02d)",
x,
y);
370 static_assert(
sizeof(Position) == 2,
"size error");
407 return Pose(
p.
next(nextDirection), nextDirection);
412 friend std::ostream&
operator<<(std::ostream& os,
const Pose& pose);
418 snprintf(str,
sizeof(str),
"(%02d, %02d, %c)",
p.
x,
p.
y,
d.
toChar());
422 static_assert(
sizeof(Pose) == 4,
"size error");
471 static_assert(
MAZE_SIZE < std::pow(2, 6),
"MAZE_SIZE is too large!");
544 return (
static_cast<uint8_t
>(
x) <
MAZE_SIZE - 1 +
z) &&
587 static_assert(
sizeof(WallIndex) == 2,
"size error");
611 } __attribute__((__packed__));
614 static_assert(
MAZE_SIZE < std::pow(2, 6),
"MAZE_SIZE is too large!");
630 static_assert(
sizeof(WallRecord) == 2,
"size error");
663 void reset(
const bool set_start_wall =
true,
664 const bool set_range_full =
false);
740 const bool pushRecords =
true);
746 void resetLastWalls(
const int num,
const bool set_start_wall =
true);
762 void print(std::ostream& os = std::cout,
772 std::ostream& os = std::cout,
780 void print(
const Positions& positions, std::ostream& os = std::cout,
796 bool parse(std::istream& is);
797 bool parse(
const std::string& filepath) {
798 std::ifstream ifs(filepath);
799 return ifs ?
parse(ifs) :
false;
818 bool parse(
const std::vector<std::string>& data,
const int mazeSize);
850 const bool clear =
false);
857 std::bitset<WallIndex::SIZE>
wall;
879 const bool b)
const {
int y
区画のy座標
Definition: Maze.h:608
unsigned int d
壁の方向
Definition: Maze.h:609
int x
区画のx座標
Definition: Maze.h:607
unsigned int b
壁の有無
Definition: Maze.h:610
迷路上の方向を表す。
Definition: Maze.h:145
static constexpr const std::array< Direction, 4 > Along4()
斜めではない4方向の配列 (for文などで使用)
Definition: Maze.h:216
static constexpr const std::array< Direction, 4 > Diag4()
斜めの4方向の配列 (for文などで使用)
Definition: Maze.h:227
AbsoluteDirection
絶対方向の列挙型。 0-7 の整数
Definition: Maze.h:150
@ SouthEast
Definition: Maze.h:158
@ North
Definition: Maze.h:153
@ South
Definition: Maze.h:157
@ NorthWest
Definition: Maze.h:154
@ NorthEast
Definition: Maze.h:152
@ East
Definition: Maze.h:151
@ West
Definition: Maze.h:155
@ SouthWest
Definition: Maze.h:156
bool isAlong() const
壁沿い方向かどうかの判定
Definition: Maze.h:198
RelativeDirection
相対方向の列挙型。 0-7 の整数
Definition: Maze.h:163
@ Back
Definition: Maze.h:168
@ Left45
Definition: Maze.h:165
@ Right45
Definition: Maze.h:171
@ Right135
Definition: Maze.h:169
@ Right
Definition: Maze.h:170
@ Left
Definition: Maze.h:166
@ Front
Definition: Maze.h:164
@ Left135
Definition: Maze.h:167
constexpr Direction(const int8_t d)
整数を引数としたコンストラクタ。
Definition: Maze.h:190
constexpr Direction(const AbsoluteDirection d=East)
デフォルトコンストラクタ。絶対方向をそのまま格納。
Definition: Maze.h:184
char toChar() const
表示用char型へのキャスト
Definition: Maze.h:206
bool isDiag() const
斜め方向かどうかの判定
Definition: Maze.h:202
friend std::ostream & operator<<(std::ostream &os, const Direction d)
stream 表示
Definition: Maze.h:210
static constexpr const int8_t Max
方向の総数。for文などで使える。
Definition: Maze.h:178
迷路の壁情報を管理するクラス
Definition: Maze.h:646
void setKnown(const Position p, const Direction d, const bool b)
Definition: Maze.h:710
bool isWall(const Position p, const Direction d) const
Definition: Maze.h:670
bool isWallBase(const std::bitset< WallIndex::SIZE > &wall, const WallIndex i) const
壁の確認のベース関数。迷路外を参照すると壁ありと返す。
Definition: Maze.h:871
friend std::istream & operator>>(std::istream &is, Maze &maze)
入力ストリームの迷路データをパースする
Definition: Maze.h:808
bool isKnown(const WallIndex i) const
壁が探索済みかを返す
Definition: Maze.h:695
int8_t min_y
既知壁の最小区画
Definition: Maze.h:863
int8_t getMinX() const
既知部分の迷路サイズを返す。計算量を減らすために使用。
Definition: Maze.h:842
void setWall(const Position p, const Direction d, const bool b)
Definition: Maze.h:684
int8_t max_x
既知壁の最大区画
Definition: Maze.h:864
const Position & getStart() const
スタート区画を取得
Definition: Maze.h:834
void setGoals(const Positions &goals)
ゴール区画の集合を更新
Definition: Maze.h:822
void setWall(const int8_t x, const int8_t y, const Direction d, const bool b)
Definition: Maze.h:687
const Positions & getGoals() const
ゴール区画の集合を取得
Definition: Maze.h:830
void setKnown(const int8_t x, const int8_t y, const Direction d, const bool b)
Definition: Maze.h:713
int8_t max_y
既知壁の最大区画
Definition: Maze.h:865
bool canGo(const WallIndex &i, bool knownOnly) const
Definition: Maze.h:726
Position start
スタート区画
Definition: Maze.h:860
bool canGo(const WallIndex i) const
通過可能かどうかを返す
Definition: Maze.h:722
int8_t wallCount(const Position p) const
引数区画の壁の数を返す
Definition: Maze.cpp:120
bool isWall(const int8_t x, const int8_t y, const Direction d) const
Definition: Maze.h:673
Positions goals
ゴール区画の集合
Definition: Maze.h:859
bool canGo(const Position p, const Direction d) const
Definition: Maze.h:723
bool isKnown(const Position p, const Direction d) const
Definition: Maze.h:696
bool isKnown(const int8_t x, const int8_t y, const Direction d) const
Definition: Maze.h:699
std::bitset< WallIndex::SIZE > known
壁の既知未知情報
Definition: Maze.h:858
Maze(const Positions &goals=Positions(), const Position start=Position(0, 0))
デフォルトコンストラクタ
Definition: Maze.h:653
int8_t min_x
既知壁の最小区画
Definition: Maze.h:862
bool updateWall(const Position p, const Direction d, const bool b, const bool pushRecords=true)
既知の壁情報と照らしあわせながら、壁を更新する関数
Definition: Maze.cpp:130
void setWallBase(std::bitset< WallIndex::SIZE > &wall, const WallIndex i, const bool b) const
壁の更新のベース関数。迷路外を参照すると無視される。
Definition: Maze.h:878
int8_t unknownCount(const Position p) const
引数区画に隣接する未知壁の数を返す
Definition: Maze.cpp:125
WallRecords wallRecords
更新した壁のログ
Definition: Maze.h:861
const WallRecords & getWallRecords() const
壁ログを取得
Definition: Maze.h:838
void print(std::ostream &os=std::cout, const int mazeSize=MAZE_SIZE) const
迷路の表示
Definition: Maze.cpp:261
void setKnown(const WallIndex i, const bool b)
壁の既知を更新する
Definition: Maze.h:707
int wallRecordsBackupCounter
壁ログバックアップのカウンタ
Definition: Maze.h:866
bool backupWallRecordsToFile(const std::string &filepath, const bool clear=false)
壁ログをファイルに追記保存する関数
Definition: Maze.cpp:389
void setWall(const WallIndex i, const bool b)
壁を更新をする
Definition: Maze.h:681
int8_t getMinY() const
Definition: Maze.h:843
bool parse(const std::string &filepath)
Definition: Maze.h:797
int8_t getMaxX() const
Definition: Maze.h:844
void resetLastWalls(const int num, const bool set_start_wall=true)
直前に更新した壁を見探索状態にリセットする
Definition: Maze.cpp:154
std::bitset< WallIndex::SIZE > wall
壁情報
Definition: Maze.h:857
void reset(const bool set_start_wall=true, const bool set_range_full=false)
迷路の初期化。壁を削除し、スタート区画を既知に
Definition: Maze.cpp:108
bool parse(std::istream &is)
特定の迷路の文字列(*.maze ファイル)から壁をパースする
Definition: Maze.cpp:165
bool isWall(const WallIndex i) const
壁の有無を返す
Definition: Maze.h:669
bool restoreWallRecordsFromFile(const std::string &filepath)
壁ログファイルから壁情報を復元する関数
Definition: Maze.cpp:416
void setStart(const Position start)
スタート区画を更新
Definition: Maze.h:826
int8_t getMaxY() const
Definition: Maze.h:845
迷路探索ライブラリはすべてこの名前空間に格納されている。
Definition: Maze.h:101
static constexpr int MAZE_SIZE_MAX
迷路の1辺の区画数の最大値。2のbit数乗の値。
Definition: Maze.h:114
std::vector< Position > Positions
Position 構造体の動的配列、集合
Definition: Maze.h:375
std::ostream & operator<<(std::ostream &os, const Directions &obj)
Directions の stream 表示
Definition: Maze.cpp:16
std::vector< Direction > Directions
Direction 構造体の動的配列、集合
Definition: Maze.h:248
std::vector< WallRecord > WallRecords
WallRecord 構造体の動的配列の定義
Definition: Maze.h:635
static constexpr int MAZE_SIZE_BIT
迷路の1辺の区画数の bit 数。bit shift などに用いる。
Definition: Maze.h:110
static constexpr int MAZE_SIZE
迷路の1辺の区画数の定数。
Definition: Maze.h:106
std::vector< WallIndex > WallIndexes
WallIndex の動的配列、集合
Definition: Maze.h:592
Position と Direction をまとめた型。位置姿勢。
Definition: Maze.h:393
Position p
位置
Definition: Maze.h:395
Pose()
Definition: Maze.h:399
friend std::ostream & operator<<(std::ostream &os, const Pose &pose)
ostream での表示
Definition: Maze.cpp:66
Direction d
姿勢
Definition: Maze.h:396
const char * toString() const
表示用文字列に変換する
Definition: Maze.h:416
Pose(const Position p, const Direction d)
Definition: Maze.h:400
Pose next(const Direction nextDirection) const
隣接姿勢の取得
Definition: Maze.h:406
迷路の区画の位置(座標)を定義。
Definition: Maze.h:268
constexpr Position(const int8_t x, const int8_t y)
コンストラクタ
Definition: Maze.h:291
Position operator+(const Position p) const
加法
Definition: Maze.h:308
bool operator!=(const Position p) const
等号否定
Definition: Maze.h:321
Position rotate(const Direction d) const
座標を回転変換する
Definition: Maze.cpp:45
bool isInsideOfField() const
フィールド内かどうかを判定する関数
Definition: Maze.h:336
int8_t x
迷路区画のx座標成分
Definition: Maze.h:276
const char * toString() const
表示用文字列に変換する
Definition: Maze.h:364
Position next(const Direction d) const
自分の引数方向に隣接した区画の Position を返す
Definition: Maze.cpp:22
uint16_t getIndex() const
迷路内の区画の一意な通し番号となるIDを取得する
Definition: Maze.h:298
static constexpr int SIZE
フィールドの区画数。配列確保などで使える。
Definition: Maze.h:271
constexpr Position()
ゼロ初期化のデフォルトコンストラクタ
Definition: Maze.h:286
Position operator-(const Position p) const
減法
Definition: Maze.h:312
uint16_t data
データ全体へのアクセス用
Definition: Maze.h:279
static Position getPositionFromIndex(const uint16_t index)
IDからPositionを作成する関数
Definition: Maze.h:303
int8_t y
迷路区画のy座標成分
Definition: Maze.h:277
friend std::ostream & operator<<(std::ostream &os, const Position p)
output-stream の表示関数。 ( x, y) の形式
Definition: Maze.cpp:60
bool operator==(const Position p) const
等号
Definition: Maze.h:316
Position rotate(const Direction d, const Position center) const
座標を回転変換する
Definition: Maze.h:354
区画ベースではなく、壁ベースの管理ID
Definition: Maze.h:455
Direction getDirection() const
方向の取得
Definition: Maze.h:523
constexpr WallIndex(const int8_t x, const int8_t y, const uint8_t z)
成分を受け取ってそのまま格納するコンストラクタ
Definition: Maze.h:481
constexpr WallIndex(const Position p, const Direction d)
表現の冗長性を除去して格納するコンストラクタ
Definition: Maze.h:488
uint16_t getIndex() const
迷路内の壁を一意な通し番号として表現したIDを返す。
Definition: Maze.h:516
int8_t y
区画座標のy成分
Definition: Maze.h:466
bool operator==(const WallIndex i) const
等号
Definition: Maze.h:501
WallIndex next(const Direction d) const
引数方向の WallIndex を取得する関数
Definition: Maze.cpp:72
int8_t x
区画座標のx成分
Definition: Maze.h:465
Position getPosition() const
位置の取得
Definition: Maze.h:521
static constexpr int SIZE
壁を unique な通し番号として表現したときの総数。 配列の確保などで使用できる。
Definition: Maze.h:460
constexpr WallIndex()
デフォルトコンストラク
Definition: Maze.h:477
bool operator!=(const WallIndex i) const
等号否定
Definition: Maze.h:506
uint16_t data
データ全体へのアクセス用
Definition: Maze.h:469
std::array< Direction, 6 > getNextDirection6() const
現在壁に隣接する、柱ではない6方向を取得
Definition: Maze.h:557
bool isInsideOfField() const
壁がフィールド内か判定する関数
Definition: Maze.h:538
constexpr WallIndex(const uint16_t i)
IDを使って初期化するコンストラクタ
Definition: Maze.h:496
uint8_t z
区画内の壁の位置。0:East, 1:North
Definition: Maze.h:467
friend std::ostream & operator<<(std::ostream &os, const WallIndex i)
表示用演算子のオーバーロード。 ( x, y, d) の形式
Definition: Maze.cpp:95
区画位置、方向、壁の有無を保持する構造体。
Definition: Maze.h:601
int y
区画のy座標
Definition: Maze.h:608
int x
区画のx座標
Definition: Maze.h:607
const Direction getDirection() const
方向の取得
Definition: Maze.h:626
WallRecord(const Position p, const Direction d, const bool b)
Definition: Maze.h:621
unsigned int b
壁の有無
Definition: Maze.h:610
friend std::ostream & operator<<(std::ostream &os, const WallRecord &obj)
表示
Definition: Maze.cpp:101
WallRecord()
コンストラクタ
Definition: Maze.h:618
WallRecord(const int8_t x, const int8_t y, const Direction d, const bool b)
Definition: Maze.h:619
struct MazeLib::WallRecord::@8::@10 uint16_t data
データ全体へのアクセス用
Definition: Maze.h:606
const Position getPosition() const
区画の取得
Definition: Maze.h:624
unsigned int d
壁の方向
Definition: Maze.h:609