• hdu 2612(bfs)Find a way


    题意:就是Y和M在@相遇的最短的时间。

    思路:基本的广搜题,先Y搜一次,然后M搜一次,最后求出Y和M在@相遇的最短的时间。

    代码实现:

    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    int n,m,count1[210][210],count2[210][210],visited[210][210];//count1记录的是Y到各个点的最短的时间
    int b[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//count2记录的是M到各个点最短的时间
    char str[210][210];
    struct node{
        int x;
        int y;
    };
    int nima(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m&&str[x][y]!='#'&&visited[x][y]==0)
            return 1;
        else
            return 0;
    }
    void bfs(int flag,int x,int y)
    {
        int f=0,r=0,t1,t2;
        node p,temp;
        queue<node>q;
        p.x=x;p.y=y;
        q.push(p);
        if(flag==1)
        {
            while(!q.empty())//基本的广搜,此时我用的是队列,此前我用的一直是数组,还是队列好多了
            {
              p=q.front();
              q.pop();
              for(int i=0;i<4;i++)
              {
                  t1=p.x+b[i][0];t2=p.y+b[i][1];
                  if(nima(t1,t2))
                  {
                     visited[t1][t2]=-1;
                     temp.x=t1;
                     temp.y=t2;
                     q.push(temp);
                     count1[t1][t2]=count1[p.x][p.y]+11;
                  }
              }
            }
        }
        else
        {
            while(!q.empty())
            {
              p=q.front();
              q.pop();
              for(int i=0;i<4;i++)
              {
                  t1=p.x+b[i][0];t2=p.y+b[i][1];
                  if(nima(t1,t2))
                  {
                     visited[t1][t2]=-1;
                     temp.x=t1;
                     temp.y=t2;
                     q.push(temp);
                     count2[t1][t2]=count2[p.x][p.y]+11;
                  }
              }
            }
        }
    }
    int main()
    {
        int i,j,x1,y1,x2,y2,a[40005][2],num,flag,min;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            getchar();
            num=0;min=100000000;
            for(i=0;i<n;i++)
                scanf("%s",str[i]);
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    count1[i][j]=0;
                    count2[i][j]=0;
                    visited[i][j]=0;
                    if(str[i][j]=='Y')
                    {
                      x1=i;
                      y1=j;
                    }
                    else if(str[i][j]=='M')
                    {
                      x2=i;
                      y2=j;
                    }
                    else if(str[i][j]=='@')
                    {
                      a[num][0]=i;
                      a[num][1]=j;
                      num++;
                    }
                }
            }
            flag=1;
            visited[x1][y1]=-1;
            bfs(flag,x1,y1);
            memset(visited,0,sizeof(visited));
            flag=2;
            visited[x2][y2]=-1;
            bfs(flag,x2,y2);
            for(i=0;i<num;i++)
            {
                if(count1[a[i][0]][a[i][1]]!=0&&count2[a[i][0]][a[i][1]]!=0)//@必须是Y和M都能到达的,否则容易出错的哦
                {
                    if(min>(count1[a[i][0]][a[i][1]]+count2[a[i][0]][a[i][1]]))
                       min=count1[a[i][0]][a[i][1]]+count2[a[i][0]][a[i][1]];
                }
            }
            printf("%d\n",min);
        }
        return 0;
    }
  • 相关阅读:
    MySql常用命令
    多线程
    redhat7.7(centOS7)安装ORACLE 11g出坑教程及问题总结与解决
    使用 CGImageRef 出现的crash
    leetcode238. 除自身以外数组的乘积
    通过位运算实现求和
    leetcode求1+2+……+n
    leetcode101. 对称二叉树
    leetcode198. 打家劫舍
    leetcode394. 字符串解码
  • 原文地址:https://www.cnblogs.com/jiangjing/p/2947835.html
Copyright © 2020-2023  润新知