結果
| 問題 |
No.697 池の数はいくつか
|
| ユーザー |
|
| 提出日時 | 2019-04-17 23:15:18 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
AC
|
| 実行時間 | 5,764 ms / 6,000 ms |
| コード長 | 2,994 bytes |
| コンパイル時間 | 2,501 ms |
| コンパイル使用メモリ | 108,160 KB |
| 実行使用メモリ | 153,228 KB |
| 最終ジャッジ日時 | 2024-11-08 08:12:14 |
| 合計ジャッジ時間 | 33,926 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Collections.Generic;
using System.Linq;
using static Input;
public class Prog
{
private const int INF = 1000000007;
private const long INFINITY = 9223372036854775807;
private struct Pair { public int x, y; }
private static int[] dx = { 1, 0, -1, 0 };
private static int[] dy = { 0, -1, 0, 1 };
public static void Main()
{
int H = NextInt();
int W = NextInt();
int[,] map = new int[H, W];
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++) map[i, j] = NextInt();
UnionFind UF = new UnionFind(H * W);
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
{
if (map[i, j] != 1) continue;
for (int d = 0; d < 4; d++)
{
int xx = j + dx[d];
int yy = i + dy[d];
if (xx < 0 || W <= xx || yy < 0 || H <= yy) continue;
if (map[yy, xx] == 1) UF.Unite(i * W + j, yy * W + xx);
}
}
HashSet<int> pos = new HashSet<int>();
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
{
if (map[i, j] == 0) { continue; }
int k = i * W + j;
int r = UF.Root(k);
//if (!pos.Contains(r))
pos.Add(r);
}
Console.WriteLine(pos.Count());
}
}
public class UnionFind
{
public List<int> parent = new List<int>();
public UnionFind(int N)
{
for (int i = 0; i < N; i++) parent.Add(i);
}
public int Root(int a)
{
if (parent[a] == a) return a;
else return parent[a] = Root(parent[a]);
}
public void Unite(int a, int b)
{
a = Root(a);
b = Root(b);
if (a == b) return;
parent[a] = parent[b];
}
public bool Same(int a, int b) { return (Root(a) == Root(b)); }
}
public class Input
{
private static Queue<string> q = new Queue<string>();
private static void Confirm() { if (q.Count == 0) foreach (var s in Console.ReadLine().Split(' ')) q.Enqueue(s); }
public static int NextInt() { Confirm(); return int.Parse(q.Dequeue()); }
public static long NextLong() { Confirm(); return long.Parse(q.Dequeue()); }
public static char NextChar() { Confirm(); return char.Parse(q.Dequeue()); }
public static string NextString() { Confirm(); return q.Dequeue(); }
public static double NextDouble() { Confirm(); return double.Parse(q.Dequeue()); }
public static int[] LineInt() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
public static long[] LineLong() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
public static string[] LineString() { return Console.ReadLine().Split(' ').ToArray(); }
public static double[] LineDouble() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
}