红黑瓷砖 描述
有一间长方形的房了,地上铺了红色和黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。编写一个程序,计算一共能够到达多少块黑色的瓷传
输入 第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过10,在接下来的H行中,每行包括W个字符,每个字符表示-块瓷砖的颜色,其规则如下
(1).表示黑色的瓷砖;
(2)# 表示白色的瓷砖;
(3)@ 表示黑色的瓷砖,并且你站在这块瓷砖上,该字符在每个数据集合中唯一出现一次
输出 输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷传)。
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,o=0,l=0,ddx,ddy,h=0;
char a,p[105][105];
int vis[105][105],g[1005],z=0;
int dx[5]={-1,1,0,0};//上下左右
int dy[5]={0,0,-1,1};
void dfs(int x,int y)
{
h=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(vis[i][j]==0)
{
h++;
}
}
}
z++;
g[z]=h;
if(g[z]==g[z-1])
{
return;
}
for(int i=0;i<4;i++)
{
ddx=x+dx[i];
ddy=y+dy[i];
if(p[ddx][ddy]=='.'&&vis[ddx][ddy]==0)
{
vis[ddx][ddy]=1;
o++;
dfs(ddx,ddy);
}
}
}
int main()
{
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a;
p[i][j]=a;
if(a=='@')
{
sx=i; sy=j;
vis[sx][sy]=2;
}
if(a=='#')
{
vis[i][j]=3;
}
}
}
dfs(sx,sy);
cout<<o-1;
return 0;
}