描述在一个Wh的矩形广场上每一块11的地面都铺设了红色或黑色瓷砖。小林同学站在某一块黑色瓷砖上他可以从此处出发移动到上下左右四个相邻的且是黑色的瓷砖上。现在他想知道通过重复上述移动所能经过的黑色瓷砖数。输入描述第一行为h、w2=w、h=50之间有一个空格隔开。以下为一个w行h列的二维字符矩阵每个字符为#分别表示该位置为黑色瓷砖、红色瓷砖、小林初始位置。输出描述输出一行一个整数表示小林从出发位置可以
#include
int main()
{
int w, h;
cin >> h >> w;
vector<vector
// 输入矩阵
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> grid[j][i];
if (grid[j][i] == '@') {
start_x = j;
start_y = i;
}
}
}
int count = 0; // 经过的黑色瓷砖数量
vector<vector<bool>> visited(w, vector<bool>(h, false)); // 记录是否已经访问过
queue<pair<int, int>> q;
// 将起始位置加入队列
q.push(make_pair(start_x, start_y));
visited[start_x][start_y] = true;
// 广度优先搜索
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
// 判断上下左右四个相邻位置是否为黑色瓷砖,如果是且未访问过,则加入队列并记录经过的黑色瓷砖数量
if (y > 0 && grid[x][y-1] == '.' && !visited[x][y-1]) {
q.push(make_pair(x, y-1));
visited[x][y-1] = true;
count++;
}
if (y < h-1 && grid[x][y+1] == '.' && !visited[x][y+1]) {
q.push(make_pair(x, y+1));
visited[x][y+1] = true;
count++;
}
if (x > 0 && grid[x-1][y] == '.' && !visited[x-1][y]) {
q.push(make_pair(x-1, y));
visited[x-1][y] = true;
count++;
}
if (x < w-1 && grid[x+1][y] == '.' && !visited[x+1][y]) {
q.push(make_pair(x+1, y));
visited[x+1][y] = true;
count++;
}
}
cout << count << endl;
return 0;
原文地址: http://www.cveoy.top/t/topic/iPd3 著作权归作者所有。请勿转载和采集!