acwing-献给阿尔吉侬的花束
https://www.acwing.com/problem/content/1103/
解题思路
先将每个字符二维图转为整形二维图,每次将阿尔吉侬的位置入队列和记下奶酪的位置记下来,在将所有可以走的地方都走完。
#include <bits/stdc++.h>
using namespace std;
struct Node{
int x,y;
};
int n,m,t;
int bk[220][220];
int fx[4][4]={{0,1},{1,0},{0,-1},{-1,0}};
vector <int> vc;
queue <Node> q;
int main(){
cin>>t;
while(t--){
int si,sj;
char c;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
//记下阿尔吉侬,奶酪的位置,和将字符二维数组转换成整形二维数组
cin>>c;
if(c=='S'){
bk[i][j]=1;
q.push({i,j});
}else if(c=='E'){
si=i;sj=j;
bk[i][j]=0;
}else if(c=='#'){
bk[i][j]=1;
}else{
bk[i][j]=0;
}
}
}
while(q.size()){
//将所有可以走的地方都走完
Node u=q.front();
q.pop();
for(int k=0;k<4;k++){
int sx=u.x+fx[k][0];
int sy=u.y+fx[k][1];
if(sx<1||sy<1||sx>n||sy>m||bk[sx][sy])
continue;
bk[sx][sy]=bk[u.x][u.y]+1;
q.push({sx,sy});
}
}
vc.push_back(bk[si][sj]);//将奶酪位置的加入Vector
}
for(auto g:vc){
if(g==0)
cout<<"oop!"<<endl;
else
cout<<g-1<<endl;
}
return 0;
}