搜索专项---双端队列广搜模型


文章目录

  • 电路维修

一、电路维修OJ链接

        本题思路:搜索专项---双端队列广搜模型_第1张图片

#include 

#define x first
#define y second

typedef std::pair PII;

constexpr int N=510;

int n,m;
char g[N][N];
int dist[N][N];
bool st[N][N];
std::deque dq;

char cs[] = "\\/\\/";//cs[]表示当前点走到4个方向的点理想状态下格子形状(边权是0的状态)
int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};//dx[]和dy[]表示可以去其他点的方向
int ix[4] = {-1, -1, 0, 0}, iy[4] = {-1, 0, 0, -1};//ix[]和iy[]表示需要踩某个方向的各种才能去到相应的点

int bfs()
{
    memset(dist,0x3f,sizeof dist);
    memset(st,false,sizeof st);
    dist[0][0]=0;
    dq.push_back({0,0});
    
    while(!dq.empty()){
        PII t=dq.front();
        dq.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;
            
            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>T;
    while(T--){
        std::cin>>n>>m;
        
        for(int i=0;i>g[i];
        
        int t=bfs();
        if(t==0x3f3f3f3f) std::cout<<"NO SOLUTION"<

 

你可能感兴趣的:(算法提高,宽度优先,算法)