HDU 2612(两次BFS+打表)

思路:和一般的bfs没有什么区别,主要是把每一个到达'@'的步数分别记录下来,需要注意Y出发不能经过M点,M出发也不能经过Y点。

#include
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
char g[205][205],vis[205][205];
struct node
{
    int x,y,step;
};
node sy,sm,all[40000];
int tot,ansy[205][205],ansm[205][205],n,m;
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
void bfsy()
{
    memset(vis,0,sizeof(vis));
    queue q;
    q.push(sy);
    while(!q.empty())
    {
        node t=q.front();
        if(g[t.x][t.y]=='@')
        {
            ansy[t.x][t.y]=t.step;
        //    cout<=0&&tx=0&&ty q;
    q.push(sm);
    while(!q.empty())
    {
        node t=q.front();
        if(g[t.x][t.y]=='@')
        {
            ansm[t.x][t.y]=t.step;
        //    cout<=0&&tx=0&&ty>n>>m)
    {
        memset(ansy,0,sizeof(ansy));
        memset(ansm,0,sizeof(ansm));
        tot=0;
        for(int i=0;i>g[i][j];
                if(g[i][j]=='Y')
                {
                    sy.x=i;
                    sy.y=j;
                    sy.step=0;
                }
                else if(g[i][j]=='M')
                {
                    sm.x=i;
                    sm.y=j;
                    sm.step=0;
                }
                else if(g[i][j]=='@')
                {
                    all[tot].x=i;
                    all[tot++].y=j;
                }
            }
        }
        bfsy();
        bfsm();
        int minn=inf;
        for(int i=0;i0&&ansm[i][j]>0)
               {
                   minn=min(minn,ansy[i][j]+ansm[i][j]);
               }
            }

        }
        cout<
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int n,m;
    while(cin>>n>>m)
    {
        int vis[100005]= {0},c,a[100005];
        for(int i=0; i>c;
            vis[c]=1;
            a[i]=c;
        }
        queue q;
        for(int i=1;i<=n;i++)
        {
            if(vis[i]==0)
            {
                q.push(i);
            }
        }
        int g=0,tot=0;
        while(tot!=n)
        {
            if(q.empty()&&g=m)
            {
                while(!q.empty())
                {
                    cout<

 

你可能感兴趣的:(BFS)