| 4559
 6
 13
 题解:注意:凡是走过的瓷砖不能被重复走过,可以通过每走一块瓷砖就将它标记,保证不重复计算任何瓷砖。 AC代码: #include<iostream>#include<cstdlib>
 #include<cstdio>
 #include<cmath>
 #include<cstring>
 #include<string>
 #include<cstdlib>
 #include<iomanip>
 #include<algorithm>
 #include<time.h>
 typedef long long LL;
 using namespace std;
 const int dx[]={1,-1,0,0};
 const int dy[]={0,0,1,-1};
 int n,m;
 char a[100][100];
 void dfs(int x,int y)
 {
 int tx,ty,i;
 a[x][y]='$'; //将‘.’用‘$’代替,然后统计‘$’的个数
 for(int i=0;i<4;i++)
 {
 tx=dx[i]+x;
 ty=dy[i]+y;
 if(tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]=='.')
 {
 dfs(tx,ty);
 }
 }
 }
 int main()
 {
 int i,j,count,x,y;
 while(~scanf("%d%d%*c",&m,&n)&&m+n!=0)
 {
 memset(a,0,sizeof(a));
 for(i=0;i<n;i++)
 {
 for(j=0;j<m;j++)
 {
 scanf("%c",&a[i][j]);
 if(a[i][j]=='@')
 {
 x=i;
 y=j;
 }
 }
 getchar();
 }
 dfs(x,y);
 count=0;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 if(a[i][j]=='$')
 count++;
 printf("%d\n",count);
 }
 return 0;
 }------------------------------------#include<iostream>
 #include<algorithm>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 
 int N,M;
 char Map[35][35];
 
 int DFS(int x,int y)
 {
 int d = 0;
 if(x < 0 || x >= N || y < 0 || y >= M || Map[x][y] == '#')
 return 0;   //返回,递归边界
 if(Map[x][y] == '.' || Map[x][y] == '@')
 {
 d = 1;      //标记,避免重复搜索
 Map[x][y] = '#';
 }
 return DFS(x+1,y) + DFS(x,y+1) + DFS(x-1,y) + DFS(x,y-1) + d;
 }
 
 int main()
 {
 while(~scanf("%d%d",&M,&N) && (N||M))
 {
 int ans = 0;
 for(int i = 0; i < N; ++i)
 scanf("%s",Map[i]);
 
 for(int i = 0; i < N; ++i)
 for(int j = 0; j < M; ++j)
 if(Map[i][j] == '@')
 ans = DFS(i,j);
 
 printf("%d\n",ans);
 }
 
 return 0;
 }
 
 
 
 
 
 
 
 
 |