1 条题解

  • 0
    @ 2024-9-14 23:48:33

    unordered_map

    的.count函数-用于查找是否出现过该状态,是返回1;

    #include<bits/stdc++.h>
    #define ULL unsigned long long
    #define LL long long
    #define PII pair<int,int>
    using namespace std;
    const int N = 1e7 + 10,M = 2 * 1e3 + 10,inf = 0x3f3f3f3f;
    
    int n,m;
    char g[25][25]; //字符矩阵
    int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; //方向数组
    int ans = -inf; //答案
    struct node
    {
        int x,y; //该状态的坐标
        unordered_map<char,int> dist; 
    	//用于查找该状态是否拿过该字符
        int cnt; //记录该状态拿了多少个字符
    };
    
    void bfs()
    {
        unordered_map<char,int> stdist; //创立起始的map
        queue<node> q;
        stdist[g[0][0]] = 1; //起始字符标记
        q.push({0,0,stdist,1});
        while (q.size())
        {
            auto t = q.front();
            q.pop();
            ans = max(ans,t.cnt); //时刻更新答案
            for(int i=0;i<4;i++)
            {
                node ne;
                ne.x = t.x + dir[i][0];
                ne.y = t.y + dir[i][1];
                ne.dist = t.dist; //复制上一个状态的unordered_map
                ne.cnt = t.cnt + 1; //拿的字符+1
                if(ne.x < 0 || ne.y < 0 || ne.x >= n || ne.y >=m) continue; //越界叉出去
                if(ne.dist.count(g[ne.x][ne.y])) continue; //已经拿过了叉出去
                ne.dist[g[ne.x][ne.y]] = 1; //记录拿过这个字符了
                q.push(ne);
            }
        }
        
    }
    int main()
    {
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        cin>>n>>m;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                cin>>g[i][j];
        bfs();
        cout<<ans;
        return 0;
    }
    
    • 1

    信息

    ID
    1108
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    (无)
    递交数
    6
    已通过
    3
    上传者