zzulioj1908(小火山的围棋梦想)

来源:互联网 发布:猎豹浏览器mac版下载 编辑:程序博客网 时间:2024/05/15 15:19

一道简单的搜索题。可以搜索每一个点,看这个点是否可以走到边界外,如果不可以走到,说明这个点被包围了,注意用bfs来做,(反正我用dfs超时了,不过听巨巨说他是用dfs做的,不知道怎么过了  ╮(╯▽╰)╭);

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;char a[30][30];int b[30][30],m,n,flag;typedef struct{    int x,y;} P;P que[2000];void bfs(int head,int tail){    int tx,ty,k;    int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};    while(head<tail)    {        for(k=0; k<=3; k++)        {            tx=que[head].x+next[k][0];            ty=que[head].y+next[k][1];            if(tx<0||ty<0||tx>n-1||ty>m-1)            {                flag=1;                return;            }            if(a[tx][ty]=='.'&&b[tx][ty]==0)            {                b[tx][ty]=1;                que[tail].x=tx;                que[tail].y=ty;                tail++;            }        }        head++;    }    return;}int main(){    int t,i,j,k,head,tail;    k=0;    scanf("%d",&t);    while(t--)    {        memset(a,0,sizeof(a));        scanf("%d%d",&n,&m);        for(i=0; i<n; i++)            scanf("%s",a[i]);         for(i=0; i<n; i++)            for(j=0; j<m; j++)            {                if(a[i][j]=='.')                {                    head=1;                    tail=1;                    memset(b,0,sizeof(b));//初始化标记数组很重要;                    que[tail].x=i;                    que[tail].y=j;                    tail++;                    b[i][j]=1;                    flag=0;                    bfs(head,tail);                    if(flag==0)                        a[i][j]='*';                }            }        printf("Case %d:\n",++k);        for(i=0; i<n; i++)            puts(a[i]);    }    return 0;}


0 0
原创粉丝点击