← Back to List

11559번: Puyo Puyo ↗

Solutions

C++14
1.8 KB | 1794 chars
#include <iostream>
using namespace std;
char ar[20][10];
int check[20][10],Cnt,total=1,totalCnt; //12*6;

void DFS(int y,int x,char a)
{
	Cnt++;
	check[y][x]=1;
	if(x>0)
	{
		if(ar[y][x-1]==a&&check[y][x-1]==0)
		{
			DFS(y,x-1,a);
		}
	}
	if(y>0)
	{
		if(ar[y-1][x]==a&&check[y-1][x]==0)
		{
			DFS(y-1,x,a);
		}
	}
	if(y<11)
	{
		if(ar[y+1][x]==a&&check[y+1][x]==0)
		{
			DFS(y+1,x,a);
		}
	}
	if(x<11)
	{
		if(ar[y][x+1]==a&&check[y][x+1]==0)
		{
			DFS(y,x+1,a);
		}
	}
}

void erasecheck()
{
	for(int y=0; y<12; y++)
		for(int x=0; x<6; x++)
		{
			if(check[y][x]==1)
			{
				ar[y][x]='.';
			}
		}
}
void change1check()
{
	for(int y=0; y<12; y++)
		for(int x=0; x<6; x++)
		{
			if(check[y][x]==1)
			{
				check[y][x]=2;
			}
		}
}

void change2check()
{
	for(int y=0; y<12; y++)
		for(int x=0; x<6; x++)
		{
			check[y][x]=0;
		}
}

void Down()
{
	for(int y=10; y>-1; y--)
	{
		for(int x=0; x<6; x++)
		{
			if(ar[y][x]!='.')
			{
				int Y=y;
				for(int y2=y+1; y2<12; y2++)
				{
					if(ar[y2][x]=='.') Y=y2;
					else break; 
				}
				ar[Y][x]=ar[y][x];
				if(Y!=y)ar[y][x]='.';
				//cout<<x<<" "<<y<<"-> "<<Y<<endl;
			}
			
		}
	}
}

int main()
{
	for(int y=0; y<12; y++)
	{
		for(int x=0; x<6; x++) cin>>ar[y][x];
	}
	
	while(total!=0)
	{
		total=0;
		Cnt=0;
		for(int y=0; y<12; y++)
		{
			for(int x=0; x<6; x++)
			{
				if(ar[y][x]!='.'&&check[y][x]==0)
				{
					Cnt=0;
					DFS(y,x,ar[y][x]);
					if(Cnt>3)
					{
						total++;
						erasecheck(); //1로 check된 좌표 .으로 바꾸기 
					}
					else
					{
						change1check();// 1로 check된 얘 2로 바꾸기 
					}
				}
			}
		}
		change2check();
		if(total>0) totalCnt++;
		Down();
		/*
		for(int y=0; y<12; y++)
		{
			for(int x=0; x<6; x++)
			{
				cout<<ar[y][x];
			}
			cout<<endl;
		}
		cout<<endl;*/
	}
	cout<<totalCnt;
}