输入格式 输入包括多个数据集合。 每个数据集合的第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。 在接下来的 H 行中,每行包括 W 个字符。每个字符表示一块瓷砖的颜色,规则如下 1)‘.’:黑色的瓷砖; 2)‘#’:红色的瓷砖; 3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。 当在一行中读入的是两个零时,表示输入结束。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> usingnamespacestd; #define x first #define y second typedefpair<int,int> PII; constint N = 21; int n,m; char g[N][N];
int res = 0; int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};
while (q.size()){ auto t = q.front(); q.pop(); res++;// 每出队一个格子,答案+1 for (int i = 0;i < 4;i++){ int x = t.x + dx[i],y = t.y + dy[i]; // 判断是否出界或者走过 if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] != '.') continue; g[x][y] = '#';// 走过的格子标记为# q.push({x,y}); } } return res; } intmain(){ while (cin >> m >> n,n && m){ PII start; // 对于g数组,因为下一个样例会读入新的数据将g数组覆盖,所以初始化可做可不做 for (int i = 0;i < n;i++) cin >> g[i];
for (int i = 0;i < n;i++) for (int j = 0;j < m;j++) if (g[i][j] == '@') start = {i,j};// 可以break提前退出
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1}; intdfs(int x,int y){ g[x][y] = '#'; int res = 1; for (int i = 0;i < 4;i++){ int xx = x+dx[i],yy = y+dy[i]; if (xx >= 0 && xx < n && yy >= 0 && yy < m && g[xx][yy] == '.'){ res += dfs(xx,yy); } } return res; }
intmain(){ while (scanf("%d%d",&m,&n)){ if (n == 0 && m == 0) break; for (int i = 0;i < n;i++) scanf("%s",g[i]); int x = 0,y = 0; for (int i = 0;i < n;i++) for (int j = 0;j < m;j++) if (g[i][j] == '@'){ x = i,y = j; break; } printf("%d\n",dfs(x,y)); } return0; }