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弄反了
同时也要注意判断顺序
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号