问题 A: Red and Black
题目描述
一个矩形的房间铺着红色或者黑色的方砖。一个人站在红砖上不能移动,在黑砖上可以沿着上、下、左、右4个方向移动到相邻的方砖。请编写一个程序,计算从起点出发可以到达的黑色方砖的数量(包括起点在内)。
起点是@,要求:遍历所有黑砖。
输入
输入第一行是两个正整数W和H; W和H分别表示x方向和y方向上的方砖数量。W和H都是正整数并且不超过20.
接下来有H行,每行包含W个字符。每个字符表示方砖的颜色如下。
‘.’ - 黑砖
‘#’ - 红砖
‘@’ - 起点
输出
输出从起点出发可以到达的黑砖的数量(包括起点在内)。
样例输入
5 4
....#
.....
#@...
.#..#
样例输出
15
#include <iostream>
#include <queue>
using namespace std;
char map[30][30];
int w,h,n;
int cot=1;
int fx[5]= {0,0,0,-1,1};
int fy[5]= {0,-1,1,0,0};
struct node{
int x,y;
};
queue <node> q;
void bfs(int x,int y) {
node current,next;
current.x=x;
current.y=y;
q.push(current);
while(!q.empty()) {
current = q.front(); // 获取当前结点
q.pop(); // 出队列
// 加入邻接结点
for(int i=1; i<=4; i++) {
next.x = current.x + fx[i];
next.y = current.y + fy[i];
if(next.x >= 1 && next.x <= h && next.y >= 1 && next.y <= w
&& map[next.x][next.y]=='.') {
map[next.x][next.y] = '#'; //将 节点i 标记为已访问
cot ++ ;
q.push(next); //Q中放入 节点i
}
}
}
}
int main(int argc, char** argv) {
cin >> w >> h;
int x,y;
for(int i=1; i<=h; i++) {
for(int j=1; j<=w; j++) {
cin >> map[i][j];
if(map[i][j] == '@'){
x=i;
y=j;
}
}
}
bfs(x,y);
for(int i=1; i<=h; i++) {
for(int j=1; j<=w; j++) {
cout << map[i][j];
}
cout << endl;
}
cout << cot;
return 0;
}
问题 B: 细胞有几个
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
如