반응형

www.acmicpc.net/problem/3184

 

3184번: 양

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

www.acmicpc.net


[ 백준 3184번 - 양 소스 코드 ]

#include<iostream>
#include<queue> 
using namespace std;
int main()
{
	int i,j;
	int c,r,x,y,sheep_cnt=0,wolf_cnt=0;
	char maps[250][250];
	bool check[250][250]={false,};
	queue<pair<int,int> > pnt;
	cin>>r>>c;
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++) cin>>maps[i][j];
	}
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++)
		{
			if(check[i][j]==false&&(maps[i][j]=='.'||maps[i][j]=='o'||maps[i][j]=='v'))
			{
				int sc=0,wc=0;
				if(maps[i][j]=='o') sc++;
				else if(maps[i][j]=='v') wc++;
				pnt.push(make_pair(i,j));
				check[i][j]=true;
				while(1)
				{
					if(pnt.size()==0) break;
					x=pnt.front().first;
					y=pnt.front().second;
					pnt.pop();
					if(x-1>=0&&check[x-1][y]==false&&maps[x-1][y]!='#')
					{
						if(maps[x-1][y]=='o') sc++;
						else if(maps[x-1][y]=='v') wc++;
						pnt.push(make_pair(x-1,y));
						check[x-1][y]=true;
					}
					if(x+1<r&&check[x+1][y]==false&&maps[x+1][y]!='#')
					{
						if(maps[x+1][y]=='o') sc++;
						else if(maps[x+1][y]=='v') wc++;
						pnt.push(make_pair(x+1,y));
						check[x+1][y]=true;
					}
					if(y-1>=0&&check[x][y-1]==false&&maps[x][y-1]!='#')
					{
						if(maps[x][y-1]=='o') sc++;
						else if(maps[x][y-1]=='v') wc++;
						pnt.push(make_pair(x,y-1));
						check[x][y-1]=true;
					}
					if(y+1<c&&check[x][y+1]==false&&maps[x][y+1]!='#')
					{
						if(maps[x][y+1]=='o') sc++;
						else if(maps[x][y+1]=='v') wc++;
						pnt.push(make_pair(x,y+1));
						check[x][y+1]=true;
					}
				}
				if(sc>wc) wc=0;
				else if(sc<=wc) sc=0;
				sheep_cnt+=sc;
				wolf_cnt+=wc;
			}
		}
	}
	cout<<sheep_cnt<<' '<<wolf_cnt;
	return 0;
}
반응형
Posted by 명문코딩컴퓨터
,