双端队列,输入时预处理数组ma存的是每个点能否往四个方向走,用二进制存,判断时按位与1,感觉思路没有问题,但就是绿红交错
#include<bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, ma[N][N], vis[N][N];
int mo1[4] = {1, 1, -1, -1},
mo2[4] = {-1, 1, 1, -1};
struct nod{
int xn, yn;
nod(int xn, int yn):xn(xn), yn(yn){}
};
deque<nod> qu;
int main(){
scanf("%d%d", &n, &m);
if((n + m) % 2){
cout<<"NO SOLUTION";
return 0;
}
memset(vis, 127, sizeof(vis));
vis[0][0] = 0;
char ci;
for(int t = 0; t < n; t ++){
for(int y = 0; y < m; y ++){
cin >> ci;
if(ci == '/'){
ma[t][y+1] += (1<<2);
ma[t+1][y] += (1<<0);
}
else{
ma[t][y] += (1<<1);
ma[t+1][y+1] += (1<<3);
}
}
}
m ++, n ++;
qu.push_front(nod(0, 0));
while(!qu.empty()){
nod asd = qu.front();
qu.pop_front();
int wy = ma[asd.xn][asd.yn];
for(int t = 0; t < 4; t ++){
int wix = asd.xn + mo1[t], wiy = asd.yn + mo2[t];
if(wix >= 0 and wix < n and wiy >= 0 and wiy < m){
int w = (wy & 1);
if(w){
if(vis[asd.xn][asd.yn] < vis[wix][wiy]){
qu.push_front(nod(wix, wiy));
vis[wix][wiy] = vis[asd.xn][asd.yn];
}
}
else if(vis[asd.xn][asd.yn] + 1 < vis[wix][wiy]){
qu.push_back(nod(wix, wiy));
vis[wix][wiy] = vis[asd.xn][asd.yn] + 1;
}
}
wy >>= 1;
}
}
printf("%d", vis[n-1][m-1]);
return 0;
}
