r×c的海面上,每个格子都有一个潮水涌动的方向(共8个方向),初始时船在某个位置,每次可以选择顺着水涌动的
方向前进不消耗能量。或者消耗能量前往任意一个方向。问从起始位置到目标位置最少需要消耗多少能量


顺着流不消耗能量,逆着流消耗一格能量

思路:
1.01 bfs   利用deque ,把不消耗能量的扔进队首,消耗的放到队尾。
2.多组数据每次记得要清数组和队列
3.这种数字间不含空格的要用char数组或者格式控制符

#include<bits/stdc++.h>
using namespace std;
const int N=1050;
char mp[N][N];
int n,m,p;
int sx,sy,ex,ey,vis[N][N];
struct node{
    int x,y,step;
};
bool judge(int x,int y){
    if(x<1||x>n||y<1||y>m)return 0;
    if(vis[x][y])return 0;
    return 1;
}
deque<node> q;
int dir[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
int bfs(){

    q.push_front({sx,sy,0});
    while(!q.empty()){
        node now=q.front();

        if(now.x==ex&&now.y==ey)return now.step;
        q.pop_front();
        vis[now.x][now.y]=1;
        for(int i=0;i<8;i++){
            int dx=now.x+dir[i][0],dy=now.y+dir[i][1];
            if(judge(dx,dy)){
                if(mp[now.x][now.y]-'0'==i) q.push_front({dx,dy,now.step});
                else q.push_back({dx,dy,now.step+1});
            }

        }
    }
    return -1;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>mp[i][j];
        }
    cin>>p;
    while(p--){
        memset(vis,0,sizeof(vis));
        while(!q.empty()) q.pop_back();
        cin>>sx>>sy>>ex>>ey;
        cout<<bfs()<<endl;

    }
    return 0;
}