codeforces 591 E (bfs and bf)

来源:互联网 发布:南京市行知基地 编辑:程序博客网 时间:2024/05/29 10:27

题目链接:点击打开链接

如果某点在最后生成的图上,那么它到各states的距离最短

直接对所有states进行BFS,计算它到图中各地所用最短距离

最后扫描整个图,取最小值即可

AC代码如下:

#include <iostream>#include <cstring>#include <algorithm>#include <queue>using namespace std;int n, m;char mapp[1005][1005];int dp[3][1005][1005];int isValid(int x, int y){    return x>=1&&x<=n&&y>=1&&y<=m&&mapp[x][y]!='#';}void wandering(char b){    int num = b-'1';    queue<pair<int, int>> qqq;    for(int i=1; i<=n; ++i)        for(int j=1; j<=m; ++j)            {                if(mapp[i][j]==b)                qqq.push(make_pair(i,j)), dp[num][i][j]=0;                else                dp[num][i][j]=(int)1e8;            }    while(!qqq.empty())    {        int x=qqq.front().first, y=qqq.front().second;  qqq.pop();        if(isValid(x+1,y)&&dp[num][x+1][y] > dp[num][x][y]+(mapp[x][y]=='.'))        {dp[num][x+1][y] = dp[num][x][y]+(mapp[x][y]=='.');     qqq.push(make_pair(x+1,y));}        if(isValid(x,y+1)&&dp[num][x][y+1] > dp[num][x][y]+(mapp[x][y]=='.'))        {dp[num][x][y+1] = dp[num][x][y]+(mapp[x][y]=='.');     qqq.push(make_pair(x,y+1));}        if(isValid(x,y-1)&&dp[num][x][y-1] > dp[num][x][y]+(mapp[x][y]=='.'))        {dp[num][x][y-1] = dp[num][x][y]+(mapp[x][y]=='.');     qqq.push(make_pair(x,y-1));}        if(isValid(x-1,y)&&dp[num][x-1][y] > dp[num][x][y]+(mapp[x][y]=='.'))        {dp[num][x-1][y] = dp[num][x][y]+(mapp[x][y]=='.');     qqq.push(make_pair(x-1,y));}    }}void solve(){    int re = 1e9;    for(int i=1;i<=n;++i)        for(int j=1;j<=m;++j)    re = min(re,dp[0][i][j]+dp[1][i][j]+dp[2][i][j]+(mapp[i][j]=='.'));    /*for(int t=0;t<3;++t)    {        for(int i=1;i<=n;++i)        {            for(int j=1;j<=m;++j)            cout<<dp[t][i][j]<<" ";            cout<<endl;        }        cout<<'\n'<<endl;    }*/    cout<<((re>=1e8)?-1:re)<<endl;}int main(){    ios::sync_with_stdio(0);    cin.tie(0);    while(cin>>n>>m)    {        memset(mapp,'#',sizeof(mapp));        for(int i=1; i<=n; ++i)            for(int j=1; j<=m; ++j)                cin>>mapp[i][j];        wandering('1');        wandering('2');        wandering('3');        solve();    }    return 0;}


原创粉丝点击