P2298 Mzc和男家丁的游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

很水的广搜的题

先输入,输入时取出起点坐标,然后定义vis数组,查找是否被标记,最后广搜(判断条件是

if(a[nx][ny]!='.'||nx<1||nx>n||ny<1||ny>m||vis[nx][ny]!=1)


代码
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#define N 2010

using namespace std;
char a[N][N];
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
int n,m;
int m1,m2;
int vis[N][N];
int d1,d2;
struct node{
    int x,y,t;
};
int kkk=0;
queue<node> q;
void bfs(){
    q.push((node){m1,m2,0});
    
    while(!q.empty()){
//        cout<<q.front().x<<" "<<q.front().y<<endl;
        for(int i=0;i<4;i++){
        int nx=dx[i]+q.front().x;
        int ny=dy[i]+q.front().y;
        if(a[nx][ny]=='d'){
            printf("%d\n",q.front().t+1);
            kkk=1;
            return;
        }
        if(a[nx][ny]!='.'||nx<1||nx>n||ny<1||ny>m||vis[nx][ny]!=1) continue;
        
                
                vis[nx][ny]=0;
                q.push((node){nx,ny,q.front().t+1});
            
        }
        q.pop();
    }    
}

int main(){
    //输入 
    cin>>n>>m;
    for(int i=1;i<=n;i++){
//        cout<<i<<endl;
        scanf("%s",a[i] + 1);
        for(int j=1;j<=m;j++){
            if(a[i][j]=='m'){
                m1=i;m2=j;
            }

        } 
    }
//    cout<<m1<<" "<<m2<<endl;
    //初始化 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            vis[i][j]=1;
        }
    }
    
    //BFS
    bfs();
    if(kkk==0)
    cout<<"No Way!";
}

写着到题时犯了个低级错误,找起点时m1和i,m2和j弄反了

同时也要注意判断顺序

posted on 2022-08-21 07:54  ljq0120  阅读(15)  评论(0)    收藏  举报