-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutil.h
84 lines (59 loc) · 2.05 KB
/
util.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#pragma once
#include <vector>
#include <functional>
#include <cassert>
struct BoardState;
typedef std::pair<int,int> Point;
typedef std::function<int(BoardState*, int)> eval_func;
typedef std::function<bool(BoardState*)> move_func;
const Point PASS = {-1,-1};
#define EMPTY 0
#define BLACK 1
#define WHITE 2
#define BOARD_W 8
#define BOARD_H 8
#define OTHER(p) (3 - (p))
#define BOUNDS(y, x) ((y >= 0 && y < BOARD_H) && ((x >= 0 && x < BOARD_W)))
std::vector<Point> adjacent(int y, int x) {
if (y > 0 && y < (BOARD_H - 1) && x > 0 && x < (BOARD_W - 1))
return { {y - 1, x}, {y - 1, x - 1}, {y - 1, x + 1},
{y, x + 1}, {y, x - 1},
{y + 1, x}, {y + 1, x - 1}, {y + 1, x + 1}, };
if (y > 0 && y < (BOARD_H - 1) && x == 0)
return { {y - 1, x}, {y - 1, x + 1},
{y, x + 1},
{y + 1, x}, {y + 1, x + 1} };
if (y > 0 && y < (BOARD_H - 1) && x == (BOARD_W - 1))
return { {y - 1, x}, {y - 1, x - 1},
{y, x - 1},
{y + 1, x}, {y + 1, x - 1} };
if (y == 0 && x > 0 && x < (BOARD_W - 1))
return { {y, x + 1}, {y, x - 1},
{y + 1, x}, {y + 1, x - 1}, {y + 1, x + 1}, };
if (y == (BOARD_H - 1) && x > 0 && x < (BOARD_W - 1))
return { {y - 1, x}, {y - 1, x - 1}, {y - 1, x + 1},
{y, x + 1}, {y, x - 1} };
if (y == 0 && x == 0)
return { {y + 1, x}, {y + 1, x + 1}, {y, x + 1} };
if (y == 0 && x == (BOARD_W - 1))
return { {y + 1, x}, {y + 1, x - 1}, {y, x - 1} };
if (y == (BOARD_H - 1) && x == 0)
return { {y - 1, x}, {y - 1, x + 1}, {y, x + 1} };
assert(y == (BOARD_H - 1) && x == (BOARD_W - 1));
return { {y - 1, x}, {y - 1, x - 1}, {y, x - 1} };
}
template<typename T>
inline void map_adjacent(const int y, const int x, const T f) {
if (y > 0) {
f(y - 1, x);
if (x > 0) f(y - 1, x - 1);
if (x < (BOARD_W - 1)) f(y - 1, x + 1);
}
if (y < (BOARD_H - 1)) {
f(y + 1, x);
if (x > 0) f(y + 1, x - 1);
if (x < (BOARD_W - 1)) f(y + 1, x + 1);
}
if (x > 0) f(y, x - 1);
if (x < (BOARD_W - 1)) f(y, x + 1);
}