题目地址:http://noi.openjudge.cn/ch0205/1818/
题目:求地图中能到达的黑砖总数
一开始没有思路,参考了:http://blog.csdn.net/c20190102/article/details/52329390
思路:简单搜索
使用二维数组保存地图,找到起始位置,从起始位置开始上下左右搜索,直到不满足条件(撞墙或者超出地图),满足条件的位置计数加1,计数值即为所求。
#include "iostream"
#include "vector"
using namespace std;
int blackCount = 0;
void searchMap(vector<vector<char>>&map,int posX,int posY,int w,int h,int &blackCount)
{
if(posX<0 || posY<0 || posX>=h || posY>=w || map[posX][posY]=='#')
return;
//能到这是,说明该位置是符合位置的黑砖,计数加1
blackCount++;
//将该位置为不可达
map[posX][posY] = '#';
//向上
searchMap(map,posX,posY-1,w,h,blackCount);
//向下
searchMap(map,posX,posY+1,w,h,blackCount);
//向左
searchMap(map,posX-1,posY,w,h,blackCount);
//向右
searchMap(map,posX+1,posY,w,h,blackCount);
}
int main()
{
while(1) {
int w, h;
cin >> w >> h;
if(w==0&&h==0)
return 0;
vector<vector<char>> vc(22, vector<char>(22)); //定义二维数组用来存储地图
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
char inC;
cin >> inC;
vc[i][j] = inC;//vc[i][j]需要声明二维数组长度,否则要用push_back
}
}
//找到起始位置
int x = 0, y = 0; //x行 y列 从0开始
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if(vc[i][j] == '@')
{
x = i;
y = j;
break;
}
}
}
//寻找,上下左右搜索直至撞墙或超出地图
searchMap(vc, x, y, w, h, blackCount);
cout << blackCount << endl;
//不要忘记在下一次循环前清空二维数组
vc.clear();
//不要忘记在下一次循环前将blackCount归零
blackCount = 0;
}
}