1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#include<bits/stdc++.h>
#define x first #define y second
using namespace std;
typedef pair<int, int> PII;
const int N=510;
int n, m;
char g[N][N]; int st[N][N];
deque<PII> q; int dist[N][N];
int bfs(int sx, int sy){ q.clear(); q.push_back({sx, sy});
memset(dist, 0x3f, sizeof dist); dist[sx][sy]=0;
int dx[4]={-1, -1, 1, 1}; int dy[4]={-1, 1, -1, 1}; char cs[4]={'\\', '/', '/', '\\'};
while(q.size()){ PII t=q.front(); q.pop_front();
for(int i=0;i<4;i++){ int x=t.x+dx[i], y=t.y+dy[i]; int u=min(t.x, x), v=min(t.y, y);
if(x<0 || x>n || y<0 || y>m) continue; if(u<0 || u>=n || v<0 || v>=m) continue; if(st[u][v]) continue;
int w=g[u][v]!=cs[i]; if(w) q.push_back({x, y}); else q.push_front({x, y});
dist[x][y]=min(dist[x][y], dist[t.x][t.y]+w);
st[u][v]=true;
if(x==n && y==m) return dist[x][y]; } }
return -1; }
void work(){ int T; cin>>T;
while(T--){ cin>>n>>m;
for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>g[i][j];
if(n+m & 1) { puts("NO SOLUTION"); continue; } memset(st, 0, sizeof st); cout<<bfs(0, 0)<<endl; } }
int main(){ work();
return 0; }
|