#include <bits/stdc++.h>
using namespace std;
int n,m,c=0,l1,l2;
char a[101][101];
int sx[4]={0,0,-1,1};
int sy[4]={-1,1,0,0};
void d(int x,int y){
c++;
a[x][y]='#';
for(int i=0;i<4;i++){
int xx=x+sx[i];
int yy=y+sy[i];
if(xx>=0&&xx<m&&yy>=0&&yy<n&&a[xx][yy]=='.') d(xx,yy);
}
}
int main() {
cin >> n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
if(a[i][j]=='@'){
l1=i,l2=j;
}
}
}
d(l1,l2);
cout<<c<<endl;
return 0;
}
共 2 条回复
#include <bits/stdc++.h> using namespace std; char q[10010][10010]; int n,m; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int bfs(int x,int y){ int sum=1; q[x][y]='#'; for(int i=0;i<4;i++){ int a=x+dx[i]; int b=y+dy[i]; if(a>=n || a<0 || b>=m || b<0) continue; if(q[a][b]!='.') continue; sum+=bfs(a,b); } return sum; } int main(){ int a,b; while(1){ cin>>m>>n; if(n==0 && m==0){ return 0; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>q[i][j]; if(q[i][j]=='@'){ a=i,b=j; } } } cout<<bfs(a,b)<<endl; } }
1、 多组数据输入,你这只能输入一次, 建议使用
while (cin >> n >> m, n != 0 || m != 0)
;2、 第二个就是多组数据,c每次需要初始为0;
3、 使用标记数组来记录(x,y) 这个点已经走过,走过的点不能继续走了,每次新的地图,标记数组也要用memset赋初值。
4、 搜索的时候n和m写反了!