ナルトとサスケ-BFS + 3次元配列判定

私のレベルは限られており、私は学習のためだけです。何か間違いを見つけたら、指摘していただきありがとうございます。

説明
地図(2次元マトリックスの形式で表される)とサスケとナルトの場所がわかっています。マップ上のすべての場所に到達できますが、一部の場所にはオシェマルの部下がいるため、これらの場所に到達するにはオシェマルの部下を倒す必要があります。ナルトには一定数のチャクラがあり、チャクラの各ユニットはオシェマルの部下を倒すことができます。ナルトが上下左右に動くことができると仮定すると、1つの距離を移動するのに1単位の時間がかかり、Dashemaruの部下を倒すのに時間はかかりません。ナルトチャクラが使い果たされた場合、彼はオシェマルの部下がいない位置にしか行くことができず、オシェラマルの部下がいる位置に移動することはできなくなります。この期間中、サスケは動きませんでしたし、オサマルの部下も動きませんでした。すみません、ナルトがサスケに追いつくのに少なくともどれくらい時間がかかりますか?
入力入力
の最初の行には、M、N、Tの3つの整数が含まれています。M行N列のマップとナルトの初期チャクラ番号Tを表します。0 <M、N <200、0≤T <10の
後に、M行N列のマップ続きます。@はナルトを表し、+はサスケを表します。*アクセスを表し、#Dashewanの部下を表します。
出力
出力には整数Rが含まれます。これは、ナルトがサスケに追いつくのにかかる最小時間を表します。ナルトがサスケに追いつかない場合は、-1が出力されます。

トピックリンク:ポータル(クリックしてください)


分析:

  • プレーン検索では、どのような情報がキューに格納されますか?1.ノード座標2.ノードステップ。キュー内のノードは状態を保存します。
  • この質問では、ノードのステータスは何ですか?1.座標2.ステップ数3.チャクラエネルギー

それで、ここに重量を判断するための3次元配列があります、なぜですか?
存在が同じポイントを通過するが、この時点でチャクラが異なる場合、結果が異なるため、私たちが判断するのは実際には状態です。

ACコード:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 210

char mp[MAXN][MAXN];
int vis[MAXN][MAXN][MAXN];
int xx[4]={
    
    0,0,-1,1},yy[4]={
    
    -1,1,0,0};
int m,n,c;
struct node{
    
    
    int x,y;
    int t;//left 查克拉
    int time;
};
node s,f;//start final

queue<node>q;

int main()
{
    
    
    cin>>m>>n>>c;
    for(int i=0;i<m;i++){
    
    //initialization
        for(int j=0;j<n;j++){
    
    
            cin>>mp[i][j];
            if(mp[i][j]=='@')s.x=i,s.y=j,s.time=0,s.t=c;//start
            if(mp[i][j]=='+')f.x=i,f.y=j,f.time=-1;//final
        }
    }
    q.push(s);vis[s.x][s.y][s.t]=1;
    while(q.size()!=0){
    
    
        node t = q.front();
        q.pop();
        if(t.x==f.x&&t.y==f.y){
    
    
            f.time=t.time;break;
        }

        for(int i=0;i<4;i++){
    
    
            node z;
            z.x=t.x+xx[i];z.y=t.y+yy[i];z.time=t.time+1;z.t=t.t;
            if(z.x<0||z.x>=m||z.y<0||z.y>=n||vis[z.x][z.y][z.t]==1)continue;//cross the border
            if(mp[z.x][z.y]=='#'){
    
    //go to 查克拉
                if(z.t>=1)z.t--;//查克拉reduce
                else continue; // 查克拉 not enough
            }
            vis[z.x][z.y][z.t]=1;
            q.push(z);
        }
    }
    return cout<<f.time<<endl,0;
}

おすすめ

転載: blog.csdn.net/weixin_43615816/article/details/114665199