P4667 Switch the Lamp On

点击查看代码
#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> PII;
const int N=510;
char g[N][N];
int dist[N][N];
int n,m;

int dx[4]={-1,-1,1,1};
int dy[4]={-1,1,-1,1};
int ix[4]={-1,-1,0,0};
int iy[4]={-1,0,-1,0};
char target[4]={'\\','/','/','\\'};


void bfs()
{
    memset(dist,0x3f,sizeof dist);
    deque<PII> dq;
    dq.push_front({1,1});
    dist[1][1]=0;

    while(!dq.empty()){
        int x=dq.front().first;
        int y=dq.front().second;
        dq.pop_front();

        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];
            int cx=x+ix[i];
            int cy=y+iy[i];

            if(nx>=1&&nx<=n+1&&ny>=1&&ny<=m+1){
                int cost=(target[i]!=g[cx][cy]);
                if(dist[nx][ny]>dist[x][y]+cost){
                    dist[nx][ny]=dist[x][y]+cost;
                    if(cost==0) dq.push_front({nx,ny});
                    else dq.push_back({nx,ny});
                }
            }
        }
    }
}
    

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);

    cin>>n>>m;
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
    }

    if((n+m+2)%2==1){
        cout<<"NO SOLUTION"<<endl;
        return 0;
    }

    bfs();

    cout<<dist[n+1][m+1]<<endl;
}

posted @ 2026-01-15 18:40  AnoSky  阅读(2)  评论(0)    收藏  举报