Plus from Picture
题意:如果图中只有一横一竖的十字架,输出YES,否则NO
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int Max=510;
char a[Max][Max];
int mark[Max],mark1[Max],m,n;
int vis[Max][Max];
int d[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct aaa
{
int x,y;
}cur,nxt;
queue<aaa>q;
void BFS(int x,int y)
{
mark[x]=1;
mark1[y]=1;
cur.x=x;
cur.y=y;
vis[x][y]=1;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0;i<4;i++)
{
nxt.x=cur.x+d[i][0];
nxt.y=cur.y+d[i][1];
if(nxt.x<0||nxt.x>m||nxt.y<0||nxt.y>n)
continue;
if((mark[nxt.x]==1||mark1[nxt.y]==1)&&vis[nxt.x][nxt.y]==0&&a[nxt.x][nxt.y]=='*')
{
q.push(nxt);
vis[nxt.x][nxt.y]=1;
}
}
}
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
mem(vis,0);
mem(mark1,0);
mem(mark,0);
for(int i=0;i<m;i++)
scanf("%s",a[i]);
int flag=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='*')
{
if(a[i][j-1]=='*'&&a[i][j+1]=='*'&&a[i+1][j]=='*'&&a[i-1][j]=='*'&&flag==0)
{
BFS(i,j);
flag=1;
break;
}
}
}
if(flag==1)
break;
}
for(int i=0;i<m&&flag==1;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='*'&&vis[i][j]==0)
{
flag=-1;
break;
}
}
if(flag==-1)
break;
}
if(flag==-1||flag==0)
printf("NO\n");
else printf("YES\n");
}
return 0;
}