题目传送门
思路:
一道很简单的搜索题,先遍历一遍数组,找到起点,再用DFS或BFS找到所有从起点能到达的点,每遍历一个ans++,需要注意一点,瓷砖可以重复走过,但不可以重复记录,所以DFS不能回溯,否则会重复记录。
代码(BFS):
#include<iostream>
#include<string>
#include<queue>
#include<map>
using namespace std;
int n,m,startX,startY;
string a[100];
int vis[100][100];
int ans;
int nx[5]={-1,1,0,0};
int ny[5]={0,0,-1,1};
queue<pair<int,int> >q;
void bfs(int x,int y){
q.push(make_pair(x,y));
ans++;
vis[x][y]=1;
while(!q.empty()){
for(int i=0;i<=3;i++){
int xx=nx[i]+q.front().first;
int yy=ny[i]+q.front().second;
if(xx>=0&&yy>=0&&xx<n&&yy<m&&vis[xx][yy]==0&&a[xx][yy]!='#'){
ans++;
q.push(make_pair(xx,yy));
cerr<<xx<<" "<<yy<<endl;
vis[xx][yy]=1;
}
}q.pop();
}
}
int main(){
cin>>m>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='@'){
startX=i;
startY=j;
}
}
}cerr<<startX<<" "<<startY<<endl;
bfs(startX,startY);
cout<<ans;
return 0;
}