csu1102 bfs

来源:互联网 发布:linux dump文件 编辑:程序博客网 时间:2024/05/09 02:13
/*思路:在大的里面找一个’*‘,然后从小多连块里的”*“对应,然后从小连块里找”*“,小多连块里的”*“的位置,相对于大多连块里的那个位置也要是”*“,否则,就不行。*/#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");    }}