#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int dist[MAXN],vis[MAXN],head[MAXN];
char mapp[1005][1005];
int n,m,cnt;
struct node{
int nxt,to,w;
}e[MAXN];
struct point{
int id;
long long dis;
friend bool operator < (point a,point b){
return a.dis>b.dis;
}
};
void add(int x,int y,int z){
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=z;
head[x]=cnt;
}
priority_queue<point>q;
void dij(){
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
q.push({1,0});
while(!q.empty()){
int tmp=q.top().id;
q.pop();
if(vis[tmp])
continue;
vis[tmp]=1;
for(int i=head[tmp];i;i=e[i].nxt){
int v=e[i].to;
int w=e[i].w;
if(dist[v]>dist[tmp]+w){
dist[v]=dist[tmp]+w;
q.push({v,dist[v]});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mapp[i][j];
}
}
int k=m+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mapp[i][j]=='\\'){
add(((i-1)*(k))+j,((i-1)*(k))+j+7,0);
add(((i-1)*(k))+j+7,((i-1)*(k))+j,0);
add(j+1+((i-1)*(k)),j+1+((i-1)*(k))+5,1);
add(j+1+((i-1)*(k))+5,j+1+((i-1)*(k)),1);
}
if(mapp[i][j]=='/'){
add(j+1+((i-1)*(k)),j+1+((i-1)*(k))+5,0);
add(j+1+((i-1)*(k))+5,j+1+((i-1)*(k)),0);
add(((i-1)*(k))+j,((i-1)*(k))+j+7,1);
add(((i-1)*(k))+j+1,((i-1)*(k))+j,1);
}
}
}
dij();
cout<<dist[(n+1)*(m+1)];
}
思路是从左上角标记为1号点,横向增加点的标号,到右下角为(n+1)*(m+1)号点,然后对数据中已经给的边建边权为0的边,然后将剩余没有边的两个点之间建边权为1的边。 现在的问题是,原题中如果跑到一个点转向之后状态会改变,但是现在建的边不会。。。