-
Notifications
You must be signed in to change notification settings - Fork 0
/
plane.go
173 lines (160 loc) · 3.3 KB
/
plane.go
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package game
import "strings"
type Direction int
const (
_ Direction = iota
TOP
BOTTOM
LEFT
RIGHT
)
// 0 1 2 3 4 5 6 7 8 9
// 0 O O X O O O O O O O
// 1 X X X X X O O O O O
// 2 O O X O O O O * O O
// 3 O X X X O * * * * *
// 4 O O O O O O O * O O
// 5 O O O O O O * * * O
// 6 O O O O O O O O O O
// 7 O O O O O O O O O O
// 8 O O O O O O O O O O
// 9 O O O O O O O O O O
// 不同朝向的飞机所对应的机头的横纵坐标的范围
// const PlaneHeadRangeMap map[Direction][] = {
// TOP: {
// row: [0, 6],
// col: [2, 7]
// },
// LEFT: {
// row: [2, 7],
// col: [0, 6]
// },
// BOTTOM: {
// row: [3, 9],
// col: [2, 7]
// },
// RIGHT: {
// row: [2, 7],
// col: [3, 9]
// }
// }
type Point struct {
row int
col int
}
func (p Point) Number() int {
return p.row*10 + p.col
}
func (p Point) PlaneList(direction Direction) []*Point {
row, col := p.row, p.col
switch direction {
case TOP:
return []*Point{
{row, col},
{row + 1, col - 2},
{row + 1, col - 1},
{row + 1, col},
{row + 1, col + 1},
{row + 1, col + 2},
{row + 2, col},
{row + 3, col - 1},
{row + 3, col},
{row + 3, col + 1},
}
case BOTTOM:
return []*Point{
{row, col},
{row - 1, col - 2},
{row - 1, col - 1},
{row - 1, col},
{row - 1, col + 1},
{row - 1, col + 2},
{row - 2, col},
{row - 3, col - 1},
{row - 3, col},
{row - 3, col + 1},
}
case LEFT:
return []*Point{
{row, col},
{row - 2, col + 1},
{row - 1, col + 1},
{row, col + 1},
{row + 1, col + 1},
{row + 2, col + 1},
{row, col + 2},
{row - 1, col + 3},
{row, col + 3},
{row + 1, col + 3},
}
case RIGHT:
return []*Point{
{row, col},
{row - 2, col - 1},
{row - 1, col - 1},
{row, col - 1},
{row + 1, col - 1},
{row + 2, col - 1},
{row, col - 2},
{row - 1, col - 3},
{row, col - 3},
{row + 1, col - 3},
}
}
return nil
}
func (p *Point) ValidHead(direction Direction) bool {
switch direction {
case TOP:
return 0 <= p.row && p.row <= 6 && 2 <= p.col && p.col <= 7
case BOTTOM:
return 3 <= p.row && p.row <= 9 && 2 <= p.col && p.col <= 7
case LEFT:
return 2 <= p.row && p.row <= 7 && 0 <= p.col && p.col <= 6
case RIGHT:
return 0 <= p.row && p.row <= 6 && 3 <= p.col && p.col <= 9
}
return false
}
type Plane struct {
id int
direction Direction
head Point
}
func (plan *Plane) CanGeneratePlan() bool {
pointList := plan.head.PlaneList(plan.direction)
for _, point := range pointList {
if point.row < 0 || point.col < 0 {
return false
}
}
return true
}
func (plan *Plane) NumberList() []int {
numberList := make([]int, 0, 10)
points := plan.head.PlaneList(plan.direction)
for _, p := range points {
numberList = append(numberList, p.Number())
}
return numberList
}
func (plan *Plane) String() string {
plist := make([][]string, 0, 10)
for i := 0; i < 10; i++ {
tem := make([]string, 0, 10)
for j := 0; j < 10; j++ {
tem = append(tem, "*")
}
plist = append(plist)
}
points := plan.head.PlaneList(plan.direction)
for _, p := range points {
plist[p.row][p.col] = "O"
}
plist[plan.head.row][plan.head.col] = "X"
ret := ""
for _, rows := range plist {
ret += strings.Join(rows, " ")
}
return ret
}