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; }