GOOGLE挑戰賽練習題1及答案(200分)
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

posted on 2006-02-13 21:36 Vincent.Chen 閱讀(3282) 評論(0) 編輯 收藏 所屬分類: 雜文