@@ -146,6 +146,171 @@ int main() {
146
146
147
147
### Javascript
148
148
149
+ #### 深搜版
150
+
151
+ ``` javascript
152
+ const r1 = require (' readline' ).createInterface ({ input: process .stdin });
153
+ // 创建readline接口
154
+ let iter = r1[Symbol .asyncIterator ]();
155
+ // 创建异步迭代器
156
+ const readline = async () => (await iter .next ()).value ;
157
+
158
+ let graph // 地图
159
+ let N , M // 地图大小
160
+ const dir = [[0 , 1 ], [1 , 0 ], [0 , - 1 ], [- 1 , 0 ]] // 方向
161
+
162
+
163
+ // 读取输入,初始化地图
164
+ const initGraph = async () => {
165
+ let line = await readline ();
166
+ [N , M ] = line .split (' ' ).map (Number );
167
+ graph = new Array (N ).fill (0 ).map (() => new Array (M ).fill (0 ))
168
+
169
+ for (let i = 0 ; i < N ; i++ ) {
170
+ line = await readline ()
171
+ line = line .split (' ' ).map (Number )
172
+ for (let j = 0 ; j < M ; j++ ) {
173
+ graph[i][j] = line[j]
174
+ }
175
+ }
176
+ }
177
+
178
+
179
+ /**
180
+ * @description : 从(x,y)开始深度优先遍历地图
181
+ * @param {*} graph 地图
182
+ * @param {*} x 开始搜索节点的下标
183
+ * @param {*} y 开始搜索节点的下标
184
+ * @return {*}
185
+ */
186
+ const dfs = (graph , x , y ) => {
187
+ if (graph[x][y] !== 1 ) return
188
+ graph[x][y] = 2 // 标记为非孤岛陆地
189
+
190
+ for (let i = 0 ; i < 4 ; i++ ) {
191
+ let nextx = x + dir[i][0 ]
192
+ let nexty = y + dir[i][1 ]
193
+ if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M ) continue
194
+ dfs (graph, nextx, nexty)
195
+ }
196
+ }
197
+
198
+ (async function () {
199
+
200
+ // 读取输入,初始化地图
201
+ await initGraph ()
202
+
203
+ // 遍历地图左右两边
204
+ for (let i = 0 ; i < N ; i++ ) {
205
+ if (graph[i][0 ] === 1 ) dfs (graph, i, 0 )
206
+ if (graph[i][M - 1 ] === 1 ) dfs (graph, i, M - 1 )
207
+ }
208
+
209
+ // 遍历地图上下两边
210
+ for (let j = 0 ; j < M ; j++ ) {
211
+ if (graph[0 ][j] === 1 ) dfs (graph, 0 , j)
212
+ if (graph[N - 1 ][j] === 1 ) dfs (graph, N - 1 , j)
213
+ }
214
+
215
+
216
+ // 遍历地图,将孤岛沉没,即将陆地1标记为0;将非孤岛陆地2标记为1
217
+ for (let i = 0 ; i < N ; i++ ) {
218
+ for (let j = 0 ; j < M ; j++ ) {
219
+ if (graph[i][j] === 1 ) graph[i][j] = 0
220
+ else if (graph[i][j] === 2 ) graph[i][j] = 1
221
+ }
222
+ console .log (graph[i].join (' ' ));
223
+ }
224
+ })()
225
+ ```
226
+
227
+
228
+
229
+ #### 广搜版
230
+
231
+ ``` javascript
232
+ const r1 = require (' readline' ).createInterface ({ input: process .stdin });
233
+ // 创建readline接口
234
+ let iter = r1[Symbol .asyncIterator ]();
235
+ // 创建异步迭代器
236
+ const readline = async () => (await iter .next ()).value ;
237
+
238
+ let graph // 地图
239
+ let N , M // 地图大小
240
+ const dir = [[0 , 1 ], [1 , 0 ], [0 , - 1 ], [- 1 , 0 ]] // 方向
241
+
242
+
243
+ // 读取输入,初始化地图
244
+ const initGraph = async () => {
245
+ let line = await readline ();
246
+ [N , M ] = line .split (' ' ).map (Number );
247
+ graph = new Array (N ).fill (0 ).map (() => new Array (M ).fill (0 ))
248
+
249
+ for (let i = 0 ; i < N ; i++ ) {
250
+ line = await readline ()
251
+ line = line .split (' ' ).map (Number )
252
+ for (let j = 0 ; j < M ; j++ ) {
253
+ graph[i][j] = line[j]
254
+ }
255
+ }
256
+ }
257
+
258
+
259
+ /**
260
+ * @description : 从(x,y)开始广度优先遍历地图
261
+ * @param {*} graph 地图
262
+ * @param {*} x 开始搜索节点的下标
263
+ * @param {*} y 开始搜索节点的下标
264
+ * @return {*}
265
+ */
266
+ const bfs = (graph , x , y ) => {
267
+ let queue = []
268
+ queue .push ([x, y])
269
+ graph[x][y] = 2 // 标记为非孤岛陆地
270
+
271
+ while (queue .length ) {
272
+ let [xx, yy] = queue .shift ()
273
+
274
+ for (let i = 0 ; i < 4 ; i++ ) {
275
+ let nextx = xx + dir[i][0 ]
276
+ let nexty = yy + dir[i][1 ]
277
+ if (nextx < 0 || nextx >= N || nexty < 0 || nexty >= M ) continue
278
+ if (graph[nextx][nexty] === 1 ) bfs (graph, nextx, nexty)
279
+ }
280
+ }
281
+ }
282
+
283
+ (async function () {
284
+
285
+ // 读取输入,初始化地图
286
+ await initGraph ()
287
+
288
+ // 遍历地图左右两边
289
+ for (let i = 0 ; i < N ; i++ ) {
290
+ if (graph[i][0 ] === 1 ) bfs (graph, i, 0 )
291
+ if (graph[i][M - 1 ] === 1 ) bfs (graph, i, M - 1 )
292
+ }
293
+
294
+ // 遍历地图上下两边
295
+ for (let j = 0 ; j < M ; j++ ) {
296
+ if (graph[0 ][j] === 1 ) bfs (graph, 0 , j)
297
+ if (graph[N - 1 ][j] === 1 ) bfs (graph, N - 1 , j)
298
+ }
299
+
300
+
301
+ // 遍历地图,将孤岛沉没,即将陆地1标记为0;将非孤岛陆地2标记为1
302
+ for (let i = 0 ; i < N ; i++ ) {
303
+ for (let j = 0 ; j < M ; j++ ) {
304
+ if (graph[i][j] === 1 ) graph[i][j] = 0
305
+ else if (graph[i][j] === 2 ) graph[i][j] = 1
306
+ }
307
+ console .log (graph[i].join (' ' ));
308
+ }
309
+ })()
310
+ ```
311
+
312
+
313
+
149
314
### TypeScript
150
315
151
316
### PhP
0 commit comments