文章目录
- 电路维修
一、电路维修OJ链接
本题思路:
#include <bits/stdc++.h>#define x first
#define y secondtypedef std::pair<int,int> PII;constexpr int N=510;int n,m;
char g[N][N];
int dist[N][N];
bool st[N][N];
std::deque<PII> 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<dist[a][b]){dist[a][b]=d;if(g[ca][cb]!=cs[i]) dq.push_back({a,b});else dq.push_front({a,b});}}}return dist[n][m];
}int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T;std::cin>>T;while(T--){std::cin>>n>>m;for(int i=0;i<n;i++) std::cin>>g[i];int t=bfs();if(t==0x3f3f3f3f) std::cout<<"NO SOLUTION"<<std::endl;else std::cout<<t<<std::endl;}return 0;
}