uva11624

来源:互联网 发布:清除软件残留 编辑:程序博客网 时间:2024/06/05 07:21

BFS,多个起始点问题,要注意BFS里面的判断条件,要不很容易出错

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn =1000+10;const int inf = 100000000;typedef pair<int,int> P;int T,n,m,sx,sy,cnt;int mp[maxn][maxn],d[maxn][maxn],d_p[maxn][maxn];int dx[4]= {1,0,-1,0},dy[4]= {0,1,0,-1};void bfs_fire(){    queue<P>que;    for(int i=1; i<=n; i++)        for(int j=1; j<=m; j++)        {            d[i][j]=inf;            if(mp[i][j]==1)            {                que.push(P(i,j));                d[i][j]=0;            }        }    while(que.size())    {        P p=que.front();        que.pop();        for(int i=0; i<4; i++)        {            int nx=p.first+dx[i],ny=p.second+dy[i];            if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&mp[nx][ny]==0&&d[nx][ny]==inf)            {                que.push(P(nx,ny));                d[nx][ny]=d[p.first][p.second]+1;            }        }    }}int bfs_people(){    for(int i=0; i<=1010; i++)        for(int j=0; j<=1010; j++)            d_p[i][j]=inf;           将整个图遍历,图外围的一圈也得遍历。    d_p[sx][sy]=0;    queue<P>queu;    queu.push(P(sx,sy));    while(queu.size())    {        P p=queu.front();        queu.pop();        for(int i=0; i<4; i++)        {            int nx=p.first+dx[i],ny=p.second+dy[i];//            printf("&&&&%d&&&&\n",d_p[nx][ny]);            if(d_p[nx][ny]<inf)continue;注意判断这个地方            d_p[nx][ny]=d_p[p.first][p.second]+1;            if(nx<1||nx>n||ny<1||ny>m)                return d_p[nx][ny];            if(d_p[nx][ny]<d[nx][ny]&&mp[nx][ny]!=-1)                queu.push(P(nx,ny));        }    }    return -1;}char ch;int main(){    scanf("%d",&T);    while(T--)    {        memset(mp,0,sizeof(mp));        memset(d_p,0,sizeof(d_p));        scanf("%d %d",&n,&m);        getchar();        for(int i=1; i<=n; i++)        {            for(int j=1; j<=m; j++)            {                scanf("%c",&ch);                if(ch=='#')                    mp[i][j]=-1;                if(ch=='F')                    mp[i][j]=1;                if(ch=='J')                {                    sx=i,sy=j;                }            }            getchar();        }        bfs_fire();        cnt=bfs_people();//        for(int i=1; i<=n; i++)//        {//            for(int j=1; j<=m; j++)//            {//                printf("%d ",d_p[i][j]);//            }//            printf("\n");//        }        if(cnt==-1)            printf("IMPOSSIBLE\n");        else printf("%d\n",cnt);    }    return 0;}


0 0
原创粉丝点击