Abc213_e-Stronger Takahashi

 

原题链接

#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
#include<stack>
#define x first
#define y second
using namespace std;
const int N=555;
typedef long long ll;
typedef pair<int,int> PII;
int n,m;
int ddx[30],ddy[30];//存放当前点不能以0花费到达时广搜的方向
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
struct Node
{
    int x,y,val;
    bool operator <(Node r)const
     {
         return val>r.val;//优先遍历值更小的
    }
 };
typedef struct Node node;
int  g[N][N];
int d[N][N];
void bfs()
{
     memset(d,0x3f,sizeof d);
     priority_queue<node> q;
     q.push({1,1,0});
     d[1][1]=0;
     while(q.size())
    {
       auto t=q.top();
         q.pop();
         for(int i=0;i<4;i++){
            int a=t.x+dy[i],b=t.y+dx[i];
             if(a<1||b<1||a>n||b>m||g[a][b])continue;
             if(t.val<d[a][b]){
                 d[a][b]=t.val;
                q.push({a,b,t.val});
             }
         }
         for(int i=1;i<25;i++)
        {
             if(abs(ddx[i])+abs(ddy[i])==4)continue;//不合法
           /*
            x***x
            *****
            **o**  o为当前点,*为o点进行一次操作能到到达的地方(d[o]+1=d[*])
            *****
            x***x
          */
             if(ddx[i]==0&&ddy[i]==0)continue;
            int a=t.x+ddy[i],b=t.y+ddx[i];
             if(a<1||b<1||a>n||b>m)continue;
            if(d[a][b]>1+t.val){
                d[a][b]=t.val+1;
                q.push({a,b,d[a][b]});
             }
         }
     }
 }
void solve()
 {
     int r=0;
    for(int i=1;i<=5;i++)for(int j=1;j<=5;j++){
         ddx[r]=i-3;ddy[r++]=j-3;
     }
     // cout<<r<<"\n";
     cin>>n>>m;
     char c;
     for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)cin>>c,g[i][j]=(c=='#'?1:0);
        bfs();
    cout<<d[n][m]<<"\n";
    return ;
 }
 int main()
{
     ios::sync_with_stdio(false);
     cin.tie(0),cout.tie(0);
     int T=1;
     //cin>>T;
     while(T--)
     {
       solve();
     }
     return 0;
 }

 

posted @ 2021-08-13 11:04  HLOA  阅读(103)  评论(0)    收藏  举报