Problem Statement | |||||||||||||
A simple line drawing program uses a blank 20 x 20 pixel canvas and a directional cursor that starts at the upper left corner pointing straight down. The upper left corner of the canvas is at (0, 0) and the lower right corner is at (19, 19). You are given a String[], commands, each element of which contains one of two possible commands. A command of the form "FORWARD x" means that the cursor should move forward by x pixels. Each pixel on its path, including the start and end points, is painted black. The only other command is "LEFT", which means that the cursor should change its direction by 90 degrees counterclockwise. So, if the cursor is initially pointing straight down and it receives a single "LEFT" command, it will end up pointing straight to the right. Execute all the commands in order and return the resulting 20 x 20 pixel canvas as a String[] where character j of element i represents the pixel at (i, j). Black pixels should be represented as uppercase 'X' characters and blank pixels should be represented as '.' characters. | |||||||||||||
Definition | |||||||||||||
|
1
public class DrawLines
2

{
3
class Pos
4
{
5
private int X;
6
private int Y;
7
private String status = ".";
8
9
public Pos(int x,int y)
10
{
11
this.X = x;
12
this.Y = y;
13
this.status = ".";
14
}
15
16
public int getX()
17
{
18
return X;
19
}
20
21
public int getY()
22
{
23
return Y;
24
}
25
26
public void setX(int x)
27
{
28
this.X = x;
29
}
30
31
public void setY(int y)
32
{
33
this.Y = y;
34
}
35
36
public void setStatus(String s)
37
{
38
this.status = s;
39
}
40
41
public String getSatus()
42
{
43
return status;
44
}
45
46
public void showPos()
47
{
48
String xStr=X+"";
49
String yStr=Y+"";
50
51
if(X<10)
52
{
53
xStr = "0"+xStr;
54
}
55
56
if(Y<10)
57
{
58
yStr = "0"+yStr;
59
}
60
}
61
}
62
63
public int min = 0, max = 19;
64
public int North = 1, South = 3, West = 2, East = 0;
65
public String LEFT = "LEFT", FORWARD = "FORWARD";
66
public Pos[][] map = null;
67
68
69
70
public DrawLines()
71
{
72
this.direction = South;
73
pos = new Pos(0,0);
74
75
//走之前初始化地圖.
76
map = new Pos[max + 1][max + 1];
77
for(int row = 0;row<=max;row++)
78
{
79
for(int col=0;col<=max;col++)
80
{
81
map[row][col] = new Pos(row,col);
82
}
83
}
84
}
85
86
public void showMap()
87
{for (int col = 0; col <= max; col++)
88
89
{
90
for (int row = 0; row <= max; row++)
91
{
92
System.out.print(map[row][col].getSatus());
93
}
94
System.out.println();
95
}
96
}
97
98
private Pos pos = null;
99
private int direction = South;
100
101
public Pos getPos()
102
{
103
return pos;
104
}
105
public void setPos(Pos pos)
106
{
107
this.pos = pos;
108
}
109
/** *//**
110
*
111
* @param cmd
112
*/
113
public void execute(String cmd)
114
{
115
if (cmd.equals("LEFT"))
116
{
117
Left();
118
}
119
else if (cmd.indexOf(FORWARD) >= 0)
120
{
121
int from = cmd.indexOf(FORWARD);
122
String stepStr = cmd.substring(from + FORWARD.length());
123
stepStr = stepStr.trim();
124
int step = Integer.parseInt(stepStr);
125
forward(step);
126
}
127
else
128
{
129
System.out.println("未知的命令,無法執行.");
130
}
131
}
132
133
public String[] execute(String[] cmds)
134
{
135
if (cmds != null)
136
{
137
for (int i = 0; i < cmds.length; i++)
138
{
139
execute(cmds[i]);
140
}
141
}
142
143
String[] rval = new String[20];
144
String tempStr = "";
145
for (int col = 0; col <= max; col++)
146
{
147
tempStr = "";
148
for (int row = 0; row <= max; row++)
149
{
150
tempStr = tempStr + map[row][col].getSatus();
151
}
152
rval[col]=tempStr;
153
}
154
return rval;
155
156
}
157
158
public void Left()
159
{
160
direction = (direction + 1) % 4;
161
}
162
163
public void forward(int step)
164
{
165
if (direction == South) //Y++
166
{
167
while (pos.getY() < max && step>0)
168
{
169
if (map[pos.getX()][pos.getY()].getSatus().equals(".")) //第一步也要畫
170
{
171
map[pos.getX()][pos.getY()].setStatus("*");
172
}
173
pos.setY(pos.getY() + 1);
174
map[pos.getX()][pos.getY()].setStatus("*");
175
map[pos.getX()][pos.getY()].showPos();
176
step--;
177
}
178
}
179
else if (direction == East) //X++
180
{
181
while (pos.getX() < max && step>0)
182
{
183
if (map[pos.getX()][pos.getY()].getSatus().equals(".")) //第一步也要畫
184
{
185
map[pos.getX()][pos.getY()].setStatus("*");
186
}
187
pos.setX(pos.getX() + 1);
188
map[pos.getX()][pos.getY()].setStatus("*");
189
map[pos.getX()][pos.getY()].showPos();
190
step--;
191
}
192
193
}
194
else if (direction == North) //Y--
195
{
196
while (pos.getY() > min && step>0)
197
{
198
if (map[pos.getX()][pos.getY()].getSatus().equals(".")) //第一步也要畫
199
{
200
map[pos.getX()][pos.getY()].setStatus("*");
201
}
202
pos.setY(pos.getY() - 1);
203
map[pos.getX()][pos.getY()].setStatus("*");
204
map[pos.getX()][pos.getY()].showPos();
205
step--;
206
}
207
}
208
else if (direction == West ) //X--
209
{
210
while (pos.getX() > min && step>0)
211
{
212
if (map[pos.getX()][pos.getY()].getSatus().equals(".")) //draw the first step
213
{
214
map[pos.getX()][pos.getY()].setStatus("*");
215
}
216
pos.setX(pos.getX() - 1);
217
map[pos.getX()][pos.getY()].setStatus("*");
218
map[pos.getX()][pos.getY()].showPos();
219
step--;
220
}
221
}
222
}
223
224
public static void main(String[] args)
225
{
226
String[] cmds =
{ "FORWARD 19","LEFT","FORWARD 19", "LEFT","FORWARD 19","LEFT","FORWARD 17","LEFT","FORWARD 17","LEFT","FORWARD 17","LEFT","FORWARD 13","LEFT","FORWARD 13","LEFT","FORWARD 13","LEFT","FORWARD 13","LEFT","FORWARD 13","LEFT",};
227
228
DrawLines dl = new DrawLines();
229
230
dl.execute(cmds);
231
232
dl.showMap();
233
234
}
235
236
}

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

174

175

176

177

178

179

180



181

182



183

184



185

186

187

188

189

190

191

192

193

194

195



196

197



198

199



200

201

202

203

204

205

206

207

208

209



210

211



212

213



214

215

216

217

218

219

220

221

222

223

224

225



226



227

228

229

230

231

232

233

234

235

236
