文章目录
- 电路维修
一、电路维修OJ链接
本题思路:
#include <bits/stdc++.h>
#define x first
#define y second
typedef 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;
}