Problem:
島の数
地勢を示す縦 12, 横 12 のマスからなる平面図があります。おのおののマスは白か黒に塗られています。白は海を、黒は陸地を表します。二つの黒いマスが上下、あるいは左右に接しているとき、これらは地続きであるといいます。この平面図では、黒いマス一つのみ、あるいは地続きの黒いマスが作る領域を「島」といいます。例えば下図には、5 つの島があります。
■■■■□□□□■■■■
■■■□□□□□■■■■
■■□□□□□□■■■■
■□□□□□□□■■■■
□□□■□□□■□□□□
□□□□□□■■■□□□
□□□□□■■■■■□□
■□□□■■■■■■■□
■■□□□■■■■■□□
■■■□□□■■■□□□
■■■■□□□■□□□□
□□□□□□□□□□□□
マスのデータを読み込んで、島の数を出力するプログラムを作成してください。
Input
入力は複数のデータセットからなります。各データセットに１つの平面図が与えられます。黒いマスを 1、白いマスを 0 で表現した 12 個の数字の列 12 行でひとつの平面図を表します。データセットの間は１つの空行で区切られています。
データセットの数は 20 を超えません。
Output
データセットごとに、島の数を１行に出力します。
Sample Input
111100001111
111000001111
110000001111
100000001111
000100010000
000000111000
000001111100
100011111110
110001111100
111000111000
111100010000
000000000000

010001111100
110010000010
010010000001
010000000001
010000000110
010000111000
010000000100
010000000010
010000000001
010010000001
010010000010
111001111100

000000000000
111111111111
100010100001
100010100001
100010100001
100010100001
100100100101
101000011101
100000000001
100000000001
111111111111
100000000001
Output for the Sample Input
5
13
4
Hint
以下はサンプルインプットを■と□で表したものです。
■■■■□□□□■■■■　　□■□□□■■■■■□□　　□□□□□□□□□□□□
■■■□□□□□■■■■　　■■□□■□□□□□■□　　■■■■■■■■■■■■
■■□□□□□□■■■■　　□■□□■□□□□□□■　　■□□□■□■□□□□■
■□□□□□□□■■■■　　□■□□□□□□□□□■　　■□□□■□■□□□□■
□□□■□□□■□□□□　　□■□□□□□□□■■□　　■□□□■□■□□□□■
□□□□□□■■■□□□　　□■□□□□■■■□□□　　■□□□■□■□□□□■
□□□□□■■■■■□□　　□■□□□□□□□■□□　　■□□■□□■□□■□■
■□□□■■■■■■■□　　□■□□□□□□□□■□　　■□■□□□□■■■□■
■■□□□■■■■■□□　　□■□□□□□□□□□■　　■□□□□□□□□□□■
■■■□□□■■■□□□　　□■□□■□□□□□□■　　■□□□□□□□□□□■
■■■■□□□■□□□□　　□■□□■□□□□□■□　　■■■■■■■■■■■■
□□□□□□□□□□□□　　■■■□□■■■■■□□　　■□□□□□□□□□□■

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
#define NIL (-1)
#define LL long long
using namespace std;
const int64_t MOD = 1e9 + 7;
const int INF = INT_MAX;
const double PI = acos(-1.0);

vector<string> island(12);
vector<vector<bool>> seen(12, vector<bool>(12));

void bfs(int h, int w) {
	queue<pair<int, int>> q;
	q.push(make_pair(h, w));

	vector<int> X, Y;
	X = { 0,-1,1,0 };
	Y = { -1,0,0,1 };

	int x, y;
	while (!q.empty()) {
		y = q.front().first;
		x = q.front().second;
		seen[y][x] = 1;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int H, W;
			H = y + Y[i];
			W = x + X[i];
			if (H < 0 || H>11) continue;
			if (W < 0 || W>11) continue;
			if ((!seen[H][W])&& (island[H][W]=='1')) q.push(make_pair(H, W));
		}
	}
	return;
}

int main() {
	for (int i = 0; i < 12; i++) island[i].assign("");

	while (cin >> island[0]) {
		//cout << island[0] << endl;
		for (int i = 1; i < 12; i++) cin >> island[i];
		//for (int i = 0; i < 12; i++) cout << island[i] << endl;
		for (int i = 0; i < 12; i++) {
			for (int j = 0; j < 12; j++) {
				seen[i][j] = 0;
			}
		}

		int cnt = 0;
		for (int i = 0; i < 12; i++) {
			for (int j = 0; j < 12; j++) {
				if ((island[i][j] == '1') && (!seen[i][j])) {
					cnt++;
					bfs(i, j);
					/*for (int i = 0; i < 12; i++) {
						for (int j = 0; j < 12; j++) {
							cout << seen[i][j];
						}
						cout << endl;
					}
					cout << endl;*/
				}
			}
		}
		cout << cnt << endl;
	}

	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 8800
final_rank: 4

code_snippet: #include <iostream>
#include <queue>
#include <string>
#include <vector>

#define N 12

using namespace std;

int main() {
  // 隣接行列
  // int adjacent[N][N];
  string s;
  while(cin >> s) {
    vector<string> numStr(N);
    // 到達したかどうかを判断
    bool reached[N][N];

    numStr[0] = s;
    for(int i = 1; i < N; i++) {
      cin >> numStr[i];
    }

    for(int i = 0; i < N; i++) {
      for(int j = 0; j < N; j++) {
        // cout << numStr[i].at(j);
        reached[i][j] = false;
      }
      // cout << endl;
    }
    // cout << numStr[N+1];

    // 始点の選択
    queue<pair<int, int> > que;
    // 島の数
    int cnt = 0;
    for(int i = 0; i < N; i++) {
      for(int j = 0; j < N; j++) {
        if(reached[i][j] == false && numStr[i].at(j) == '1') {
          que.push(pair<int, int>(i, j));
          // その島のカウントをつける。
          cnt++;
          while(!que.empty()) {
            // popする値を保存する。
            int f = que.front().first;
            int s = que.front().second;
            // cout << "front = (" << f << "," << s << ")" << endl;
            // popする値をtrueに変更する。
            reached[f][s] = true;
            que.pop();

            // 右
            if(!(s == N-1)) {
              // cout << "log右" << endl;
              if(reached[f][s+1] == false && numStr[f].at(s+1) == '1') que.push(pair<int, int>(f, s+1));
            }
            // 左
            if(!(s == 0)) {
              // cout << "log左" << endl;
              if(reached[f][s-1] == false && numStr[f].at(s-1) == '1') que.push(pair<int, int>(f, s-1));
            }
            // 上
            if(!(f == 0)) {
              // cout << "log上" << endl;
              if(reached[f-1][s] == false && numStr[f-1].at(s) == '1') que.push(pair<int, int>(f+1, s));
            }
            // 下
            if(!(f == N-1)) {
              // cout << "log下" << endl;
              if(reached[f+1][s] == false && numStr[f+1].at(s) == '1') que.push(pair<int, int>(f+1, s));
            }

          }
        }
      }
    }
    cout << cnt << endl;
    // 終了判定
    // if(cin.eof()) break;
  }
}
accuracy: 1
time_ms: 20
memory_kb: 8740
final_rank: 1

code_snippet: #include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PA;
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
queue<PA> que;
int main(){
  int n,ans;
  char m[13][13];
  
  while(cin >> m[0]){
    
    for(int j = 0;j < 12;j++){
      if(j==0) continue;
      cin >> m[j];
    }
    ans = 0;
    for(int j = 0;j < 12;j++){
      for(int k = 0;k < 12;k++){
	if(m[j][k] == '1'){
	  que.push(PA(j,k));
	  while(!que.empty()){
	    PA p=que.front();que.pop();
	    m[p.first][p.second] = '0';
	    for(int l = 0;l < 4;l++){
	      int y = p.first+dy[l];
	      int x = p.second+dx[l];
	      if(x<0||y<0||x>=12||y>=12||m[y][x]=='0') continue;
	      que.push( PA(y,x) );
	    }
	  }
	  ans++;
	}
      }
    }
    cout << ans << endl;
  }
  return (0);
}
accuracy: 1
time_ms: 30
memory_kb: 8768
final_rank: 3

code_snippet: #include<bits/stdc++.h>
using namespace std;

int vecx[4]={0,1,0,-1},vecy[4]={1,0,-1,0};

void explore(string atlas[12],int vstd[12][12],int i,int j){
    queue<pair<int,int> > bfs;
    bfs.push(make_pair(i,j));
    while(!bfs.empty()){
        int x=bfs.front().first,y=bfs.front().second;
        vstd[x][y]=1;
        for(int k=0; k<4; k++){
            int nextx=x+vecx[k],nexty=y+vecy[k];
            if(nextx<0||nextx>11||nexty<0||nexty>11)continue;
            if(atlas[x+vecx[k]][y+vecy[k]]=='1'&&vstd[x+vecx[k]][y+vecy[k]]==0){
                bfs.push(make_pair(x+vecx[k],y+vecy[k]));
            }
        }
        bfs.pop();
        //cout<<x<<' '<<y<<endl;
    }
}

int main(){
    string atlas[12];
    int vstd[12][12],cnt;
    while(cin>>atlas[0],!cin.eof()){
        cnt=0;
        for(int i=1; i<12; i++){
            cin>>atlas[i];
        }
        fill(vstd[0],vstd[12],0);
        for(int i=0; i<12; i++){
            for(int j=0; j<12; j++){
                if(vstd[i][j]==0&&atlas[i][j]=='1'){
                    explore(atlas,vstd,i,j);
                    cnt++;
                }
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 8764
final_rank: 2