Wannaflyキャンプ2020日6Iあなたは私の馬の.jpgを怖がっ - BFSを

暴力へのBFS

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

int n,m,f[105][105];
char s[105][105];
struct pt {int x,y;};

bool check(int i,int j) {
    if(i<=0 || i>n || j<=0 || j>m) return false;
    if(s[i][j]=='X') return false;
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>s[i]+1;
    int si,sj;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            if(s[i][j]=='M') si=i,sj=j;
        }
    }
    memset(f,0x3f,sizeof f);
    f[si][sj]=0;
    queue <pt> q;
    q.push((pt){si,sj});
    while(!q.empty()) {
        int pi=q.front().x,pj=q.front().y;
        q.pop();
        int t=f[pi][pj];
        if(check(pi+1,pj)) {
            if(check(pi+2,pj+1)&&0x3f3f3f3f==f[pi+2][pj+1])f[pi+2][pj+1]=min(f[pi+2][pj+1],t+1),q.push((pt){pi+2,pj+1});
            if(check(pi+2,pj-1)&&0x3f3f3f3f==f[pi+2][pj-1])f[pi+2][pj-1]=min(f[pi+2][pj-1],t+1),q.push((pt){pi+2,pj-1});
        }
        if(check(pi-1,pj)) {
            if(check(pi-2,pj+1)&&0x3f3f3f3f==f[pi-2][pj+1])f[pi-2][pj+1]=min(f[pi-2][pj+1],t+1),q.push((pt){pi-2,pj+1});
            if(check(pi-2,pj-1)&&0x3f3f3f3f==f[pi-2][pj-1])f[pi-2][pj-1]=min(f[pi-2][pj-1],t+1),q.push((pt){pi-2,pj-1});
        }
        if(check(pi,pj+1)) {
            if(check(pi+1,pj+2)&&0x3f3f3f3f==f[pi+1][pj+2])f[pi+1][pj+2]=min(f[pi+1][pj+2],t+1),q.push((pt){pi+1,pj+2});
            if(check(pi-1,pj+2)&&0x3f3f3f3f==f[pi-1][pj+2])f[pi-1][pj+2]=min(f[pi-1][pj+2],t+1),q.push((pt){pi-1,pj+2});
        }
        if(check(pi,pj-1)) {
            if(check(pi+1,pj-2)&&0x3f3f3f3f==f[pi+1][pj-2])f[pi+1][pj-2]=min(f[pi+1][pj-2],t+1),q.push((pt){pi+1,pj-2});
            if(check(pi-1,pj-2)&&0x3f3f3f3f==f[pi-1][pj-2])f[pi-1][pj-2]=min(f[pi-1][pj-2],t+1),q.push((pt){pi-1,pj-2});
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) cout<<(f[i][j]>1e9?-1:f[i][j])<<(j==m?"":" ");
        if(i<n)cout<<endl;
    }
}

おすすめ

転載: www.cnblogs.com/mollnn/p/12293249.html
おすすめ