アットウィキロゴ

Surrounding Area

2014 : Surrounding Area



解説

杭が囲む領域を出力する。
左上から要素を見ていき、杭が見つかったら再帰を呼び出す。
再帰関数で、まだ塗られてない部分に色を塗っていく。すでに違う色で塗られていた場合は白黒以外で塗る。
最後に、塗った箇所を数え上げる。

プログラム

C


C++

対応するregion、endregionプラグインが不足しています。対になるようプラグインを配置してください。
#include<iostream>
using namespace std;

char map[51][51];
int w,h;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};


void search(int x,int y,char c){

for(int i = 0; i < 4; i++){
	if(x+dx[i] < w && x+dx[i] >= 0 && y+dy[i] < h && y+dy[i] >= 0){
			if(map[y+dy[i]][x+dx[i]] == '.'){
				map[y+dy[i]][x+dx[i]] = c;
				search(x+dx[i],y+dy[i], c);
			}else if((map[y+dy[i]][x+dx[i]] == 'w' && c == 'b') || (map[y+dy[i]][x+dx[i]] == 'b' && c == 'w')){
			map[y+dy[i]][x+dx[i]] = '#';
				search(x+dx[i],y+dy[i], c);
			}
			
		}
	}	

	return;

}

int main(){

	while(cin >> w >> h,w||h){

		for(int i = 0; i < h; i++){
			cin >> map[i];
		}

		for(int i = 0; i < h; i++){
			for(int j = 0; j < w; j++){
				if(map[i][j] == 'W'){
					search(j,i,'w');
				}
				if(map[i][j] == 'B'){					
					search(j,i,'b');
				}
			}
		}

		int cw = 0, cb = 0;
		for(int i = 0; i < h; i++){
			for (int j = 0; j < w; j++) {
				if (map[i][j] == 'w') cw++;
				if (map[i][j] == 'b') cb++;
			}
	}

		cout << cb << ' ' << cw << endl;
	}
	return 0;
}

Java

解説と方法が違います。
→入力されたマップから黒白どちらかの土地になりうる'.'を探し、そこから繋がっている面積を1140番と同じ方法(見終わった場所を#に変える)で数え上げる。
その途中でBの杭が見つかった場合はboolean型変数Blackをtrueに、Wの場合はWhiteをtrueにする。
数え上げが終了したときにBlackのみtrueの場合は数え上げた面積はBlackの面積に加算し、Whiteのみtrueの場合はWhiteの面積に加算する。
BlackとWhiteが同じ場合はどちらの土地でもない。加算終了後、再びマップから'.'を探し数え上げする。
対応するregion、endregionプラグインが不足しています。対になるようプラグインを配置してください。
import java.util.Scanner;
public class SurroundingArea2014 {
static char[][] map;
static boolean Black,White;
static int w,h,count;
static void BlackOrWhite(int y,int x){
	if(map[y][x]=='W') White=true;
	if(map[y][x]=='B') Black=true;
}
static void move(int y,int x){
	map[y][x]='#';
	count++;
	if(0<y){
		BlackOrWhite(y-1,x);
		if(map[y-1][x]!='#'&&map[y-1][x]!='W'&&map[y-1][x]!='B') move(y-1,x);//↑
	}
	if(x<w-1){
		BlackOrWhite(y,x+1);
		if(map[y][x+1]!='#'&&map[y][x+1]!='W'&&map[y][x+1]!='B') move(y,x+1);//→			
	}
	if(0<x){
		BlackOrWhite(y,x-1);
		if(map[y][x-1]!='#'&&map[y][x-1]!='W'&&map[y][x-1]!='B') move(y,x-1);//←
	}
	if(y<h-1){
		BlackOrWhite(y+1,x);
		if(map[y+1][x]!='#'&&map[y+1][x]!='W'&&map[y+1][x]!='B') move(y+1,x);//↓
	}
}
public static void main(String[] args){
	Scanner scan=new Scanner(System.in);
	while(true){
		w=scan.nextInt(); h=scan.nextInt();
		if(w==0&&h==0){
			break;
		}else{
			map=new char[h][w];
			for(int i=0;i<h;i++){
				String s=scan.next();
				for(int j=0;j<w;j++){
					map[i][j]=s.charAt(j);
				}
			}
			int ans1=0;
			int ans2=0;
			for(int i=0;i<h;i++){
				for(int j=0;j<w;j++){
					Black=false; White=false;
					count=0;
					if(map[i][j]=='.'){
						move(i,j);
						if(Black&&!White) ans1+=count;
						if(!Black&&White) ans2+=count;
					}
				}
			}
			System.out.println(ans1+" "+ans2);
		}
	}
}
}
最終更新:2012年12月10日 20:16