/*
思路:在大的里面找一个’*‘,然后从小多连块里的”*“对应,然后从小连块里找”*“,小多连块里的”*“的位置,
相对于大多连块里的那个位置也要是”*“,否则,就不行。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
struct node
{
int x,y;
int x1,y1;
};
char map1[15][15];
char map2[15][15];
int vis[15][15];
int flag[15][15];
int n,m;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int jude(int x,int y)
{
if(x<1||x>n||y<1||y>m) return 0;
return 1;
}
int bfs(int x,int y)
{
int flag1;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(map2[i][j]=='*')
{ flag1=1;
memset(flag,0,sizeof(flag));
flag[i][j]=1;
vis[i][j]=1;
node a={i,j,x,y};
queue<node>q;
q.push(a);
while(!q.empty()&&flag1)
{
a=q.front();
q.pop();
for(int i=0;i<4&&flag1;i++)
{
int xx=dir[i][0]+a.x;
int yy=dir[i][1]+a.y;
int xx1=dir[i][0]+a.x1;
int yy1=dir[i][1]+a.y1;
if(!jude(xx,yy)) continue ;
if(map2[xx][yy]!='*') continue ;
if(flag[xx][yy]) continue ;
if(map1[xx1][yy1]!='*') flag1=0;
if(vis[xx1][yy1]) flag1=0;
node b={xx,yy,xx1,yy1};
vis[xx1][yy1]=1;
flag[xx][yy]=1;
q.push(b);
}
}
if(flag1==1) return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
for(int i=1;i<=n;i++)
{
scanf("%s",map1[i]+1);
}
/* for(int i=1;i<=n;i++)
puts(map1[i]+1);*/
for(int i=1;i<=m;i++)
{
scanf("%s",map2[i]+1);
}
/* for(int i=1;i<=m;i++)
puts(map2[i]+1);*/
memset(vis,0,sizeof(vis));
int flag=1;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=n&&flag;j++)
{
if(map1[i][j]=='*'&&!vis[i][j])
{
if( !bfs(i,j)) {printf("0\n"); flag=0;}
}
}
}
if(flag) printf("1\n");
}
}
csu1102 bfs
最新推荐文章于 2017-08-23 21:04:55 发布