#include<bits/stdc++.h>
using namespace std;
const int N=510;
typedef pair<int,int> PII;
int n,m;
char g[N][N];
int d[N][N];//记录(0,0)到其他各点的距离
bool st[N][N];//记录节点是否更新完成(节点可能多次入队)
int bfs(){
int dx[]={-1,-1,1,1},dy[]={-1,1,1,-1};//连通性偏移
int ix[]={-1,-1,0,0},iy[]={-1,0,0,-1};//g矩阵与节点的偏移
string cs="\\/\\/";//费用是0时节点四周原矩阵应该是什么(\\是输入\,第一个\起转义的作用)
memset(d,0x3f,sizeof d);//多组输入需要每次重置
memset(st,0,sizeof st);
deque<PII> q;
q.push_back({0,0});
d[0][0]=0;
while(q.size()){
PII t=q.front();
q.pop_front();
int x=t.first,y=t.second;
if(st[x][y]) continue;
st[x][y]=true;//只有出队时证明节点更新完成,更新其状态
if(x==n&&y==m) return d[x][y];//如果已经到达(n,m),直接返回即可
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];//遍历
if(a<0||a>n||b<0||b>m) continue;
if(st[a][b]) continue;//越界或者已经d已经更新完毕,跳过
int ga=x+ix[i],gb=y+iy[i];
int w=(g[ga][gb]!=cs[i]);//对比计算路径的费用
int dist=d[x][y]+w;//计算距离(0,0)的路径长度
if(dist<d[a][b]){//节点可能多次入队,只有路径更短时,才能让其更新d数组
d[a][b]=dist;//只有更短时才更新就有些类似于dijkstra算法
if(w) q.push_back({a,b});//w==1 双端队列
else q.push_front({a,b});//w==0
}
}
}
}
int main(){
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){//从(0,0)只能走到x,y坐标和为偶数的点
puts("NO SOLUTION");
}
else{
cout<<bfs()<<endl;
}
}
}
棒!