zoukankan      html  css  js  c++  java
  • luogu P1141 01迷宫

    https://www.luogu.org/problem/show?pid=1141

    还不太会用 BFS

    然后就跟着感觉走了一波

    经历了很多错误 刚开始的读入 然后BFS的过程

    最后T三个点

    看到别人的题解思路 后 自己改了一次

    用dp[i][j] 记录 i ,j是在哪个联通快里面的

    然后 ans[cnt] 记录 第cnt个联通块的结果

    //bfs + 记忆话搜索
    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<int,int> pii;
    int n,m;
    char mp[1010][1010];
    int dp[1010][1010]; //记录每个点的情况的父亲节点
    bool vis[1010][1010];
    int fx[]={-1,0,0,1};
    int fy[]={0,-1,1,0};
    int ans[1000*1000 +100];//存储结果
    int cnt = 1;
    bool check(int x,int y,char k)
    {
        if(vis[x][y]==0 && mp[x][y] == k && x>=1 && x<=n && y<=n && y>=1 )
        {
            return 1;
        }
        return 0;
    }
    int bfs(int x,int y)
    {
        int sum = 0;
        queue<pii> que;
        que.push({x,y});
        //cout<< "yes1 "<<endl;
        //vis[x][y] = 1;
        while (que.size())
        {
            pii now = que.front(); que.pop();
            //cout<< "yes2 "<<endl;
            if(vis[now.first][now.second] )
                continue;
            sum++;
            vis[now.first][now.second]  = 1;
            dp[now.first][now.second] = cnt;
            char k = (mp[now.first][now.second] == '1')?'0':'1';
            for(int i=0;i<4;i++)
            {
                //cout<< "yes3 "<<endl;
                int dx = now.first +fx[i];
                int dy = now.second + fy[i];
                //cout << dx <<" "<<dy<<endl;
                if(check(dx,dy,k))
                {
                    //sum++;
                    //cout<< "yes4 "<<endl;
                    que.push({dx,dy});
                }
                //vis[dx][dy] = 1;
            }
        }
        //cout<<sum<<endl;
        ans[cnt++] = sum;
        return sum;
    }
    int main ()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf(" %c", &mp[i][j]);
        while (m--)
        {
            //memset(vis,0,sizeof(vis));
            int x,y;
            scanf("%d %d",&x,&y);
            if( dp[x][y] )
            {
                cout<< ans[ dp[x][y] ]<<endl;
                continue;
            }
            cout<< bfs(x,y)<<endl;
        }
    }
  • 相关阅读:
    常见总结
    手机号中间四位替换为****
    写给30岁之前的我
    顺序栈ADT简单的实现
    快速排序
    关于存储类的例子总结
    非有序的静态查找表的查找某个元素的算法
    有序的静态查找表的折半(二分)查找算法
    【项目】项目125
    【项目】项目132
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7462779.html
Copyright © 2011-2022 走看看