193A. Cutting Figure - Codeforces Solution C++

  Problem Link : 193A. Cutting Figure 


✅ C++ Solution :

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

#define ll long long int
#define pp pair<int,int>
#define mp make_pair

int n,m;
char arr[51][51];
int disc[51][51];
int low[51][51];
pp parent[51][51];

int t;
bool flag;

int lt[]={-1,1,0,0};
int rt[]={0,0,-1,1};


void dfs(int i, int j, pp p)
{
	if(flag)
		return;
	parent[i][j]=p;
	disc[i][j]=++t;
	low[i][j]=disc[i][j];
	int x,y,child=0;
	for(int k=0;k<4;k++)
	{
		x=i+lt[k];
		y=j+rt[k];

		if(x>=0 && x<n && y>=0 && y<m && arr[x][y]=='#')
		{
			if(mp(x,y)==p)
				continue;
			if(!disc[x][y])
			{
				child++;
				dfs(x,y,mp(i,j));

				low[i][j]=min(low[i][j],low[x][y]);

				if(parent[i][j]!=mp(-1,-1) && low[x][y] >= disc[i][j])
				{
					flag=1;
					return;
				}

			}
			else
				low[i][j]=min(low[i][j],disc[x][y]);
		}
	}

	if(parent[i][j]==mp(-1,-1) && child>1)			// root child tells no of subtrees not no of child
		flag=1;

}

int main()
{
	int cnt=0;
	cin>>n>>m;
	t=0,flag=0;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			cin>>arr[i][j];
			if(arr[i][j]=='#')
				cnt++;
		}
	if(cnt<3)
	{
		cout<<"-1";
		exit(0);
	}
	memset(disc,0,sizeof(disc));
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			if(arr[i][j]=='#' && !disc[i][j])
				dfs(i,j,mp(-1,-1));

	if(flag)
		cout<<1;
	else
		cout<<2;

}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!