CF1182B Plus from Picture

CF1182B Plus from Picture

题目传送门

深搜的练手题。

题目大意:找到一个 由 * 组成的 +,要求用完矩阵中全部的 * ,同时要求有且仅有一个。

思路:先找到一个 * ,让它成为中心点,然后向四个方向进行拓展,同时记录沿途 * 的个数。如果 * 的个数刚好和矩阵中 * 的个数相同,记为一种合法情况,再在最后判断它是否等于 11 即可。

但是要注意一点,如果在一个矩阵中仅有一个 * ,按照刚才的方法统计到 00 个,加上中心点的一个 * ,刚好和矩阵中 *,的个数相同,但是这种情况是不合法的。

解决方法就是开一个 flag,当遇到四个方向任意一个方向没有 * 的时候,不予累加以及判断即可。

#include<bits/stdc++.h>
using namespace std;
const int N =1000;
char a[N][N];
int n,m,s1,s2,s3,s4;
bool flag;
bool check(int x,int y)
{
	return x>=1&&x<=n&&y>=1&&y<=m;
}
int dfs1(int x,int y)
{	
	int xx=x+1;
	int yy=y;
	if(check(xx,yy)&&a[xx][yy]=='*')
		s1++,dfs1(xx,yy);
	if(s1==0)flag=1;	
	return s1;
}
int dfs2(int x,int y)
{
	int xx=x-1;
	int yy=y;
	if(check(xx,yy)&&a[xx][yy]=='*')
		s2++,dfs2(xx,yy);
	if(s2==0)flag=1;	
	return s2;
}
int dfs3(int x,int y)
{
	int xx=x;
	int yy=y+1;
	if(check(xx,yy)&&a[xx][yy]=='*')
		s3++,dfs3(xx,yy);
	if(s3==0)flag=1;	
	return s3;
}
int dfs4(int x,int y)
{
	int xx=x;
	int yy=y-1;
	if(check(xx,yy)&&a[xx][yy]=='*')
		s4++,dfs4(xx,yy);	
	if(s4==0)flag=1;
	else
		return s4;
}
int main()
{
	int sum=0,ans=0;
	cin>>n>>m;
	if(n==1&&m==1)
		cout<<"NO"<<endl,exit(0);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='*')
				sum++;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			flag=0;
			if(a[i][j]=='*')
			{
				s1=0,s2=0,s3=0,s4=0;
				int last=(dfs1(i,j)+dfs2(i,j)+dfs3(i,j)+dfs4(i,j))+1;
				if(last==sum&&!flag)
					ans++;
			}
		}
			
	if(ans!=1)
		cout<<"NO"<<endl,exit(0);
	else
		cout<<"YES"<<endl,exit(0);
}
posted @   June_Failure  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示