SRM 541 Div2 1000pt : NonXorLife

問題概要=解法

幅優先探索で距離K以下のマスの個数を求める問題。
簡単に感じられたけど、Div 2の正解者はかなり少なかった。

acceptされたコード

#include <vector>
#include <string>
#include <queue>
using namespace std;

const int MAX_K = 1500;

const int dy[] = {0, 0, 1, -1}, dx[] = {1, -1, 0, 0};

int dist[2*(MAX_K+100)][2*(MAX_K+100)];
bool visited[2*(MAX_K+100)][2*(MAX_K+100)];

struct NonXorLife {

	int countAliveCells(vector <string> field, int K) {
		queue< pair<int,int> > que;

		for(int i=0; i<(int)field.size(); ++i){
			for(int j=0; j<(int)field[i].length(); ++j){
				if(field[i][j] == 'o'){
					visited[i+MAX_K][j+MAX_K] = true;
					que.push(make_pair(i+MAX_K, j+MAX_K));
				}
			}
		}

		for(;!que.empty();){
			int y = que.front().first, x = que.front().second;
			que.pop();

			if(dist[y][x] == K){
				break;
			}
			for(int k=0; k<4; ++k){
				int ny = y + dy[k], nx = x + dx[k];
				if(!visited[ny][nx]){
					visited[ny][nx] = true;
					dist[ny][nx] = dist[y][x] + 1;
					que.push(make_pair(ny, nx));
				}
			}
		}

		int ans = 0;
		for(int i=0; i<2*(MAX_K+100); ++i){
			for(int j=0; j<2*(MAX_K+100); ++j){
				if(visited[i][j]){
					++ans;
				}
			}
		}
		return ans;
	}

};