AcWing 175. 电路维修(搜索)

题目描述

题目链接

题目大意

  1. 找到一条从左上角到右下角的通路
  2. 旋转格子次数最少

解题思路

  • 运用双端队列广搜
  1. 不旋转则权重为0,旋转则权重为1
  2. 从队头扩展出的边的权重为0时,插到队头,权重为1时,插到队尾
  3. 偏移量求解如下图:

题目代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <deque>  //双端队列

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 510, M = N * N;

int n, m;
char g[N][N];
int dist[N][N];
bool st[N][N];

int bfs()
{
    memset(dist, 0x3f, sizeof dist);
    memset(st, 0, sizeof st);
    dist[0][0] = 0;
    deque<PII> q;
    q.push_back({0, 0});  // deque.push_back()
    
    char cs[] = "\\/\\/";  // ‘\’是转义字符
    int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};  // 中间点可以去到的4个方向的偏移量
    int ix[4] = {-1, -1, 0, 0}, iy[4] = {-1, 0, 0, -1};  // 中间点周围对应的四个连通的电缆
    
    while(q.size())  // deque.size()
    {
        PII t = q.front();  // deque.front()
        q.pop_front();  // deque.pop_front()
        
        if(st[t.x][t.y]) continue;
        st[t.x][t.y] = true;
        
        for(int i = 0; i < 4; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if(a < 0 || a > n || b < 0 || b > m) continue;  // 格子数 + 1 = 格点数
            
            int ca = t.x + ix[i], cb = t.y + iy[i];
            int d = dist[t.x][t.y] + (g[ca][cb] != cs[i]);
            
            if(d < dist[a][b])
            {
                dist[a][b] = d;
                
                if(g[ca][cb] != cs[i]) q.push_back({a, b});  // deque.push_back()
                else q.push_front({a, b});  // deque.push_front()
            }
        }
    }
    
    return dist[n][m];
}

int main()
{
    int T;
    scanf("%d", &T);
    while (T -- )
    {
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);

        int t = bfs();

        if (t == 0x3f3f3f3f) puts("NO SOLUTION");
        else printf("%d\n", t);
    }

    return 0;
}
posted @   esico  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示