CF1182B Plus from Picture
CF1182B Plus from Picture
深搜的练手题。
题目大意:找到一个 由 *
组成的 +
,要求用完矩阵中全部的 *
,同时要求有且仅有一个。
思路:先找到一个 *
,让它成为中心点,然后向四个方向进行拓展,同时记录沿途 *
的个数。如果 *
的个数刚好和矩阵中 *
的个数相同,记为一种合法情况,再在最后判断它是否等于 即可。
但是要注意一点,如果在一个矩阵中仅有一个 *
,按照刚才的方法统计到 个,加上中心点的一个 *
,刚好和矩阵中 *
,的个数相同,但是这种情况是不合法的。
解决方法就是开一个 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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】