1.1 算法分析
这是一道很简单的广度优先搜索问题,我们以原始位置开始向四个方向搜索,如果是黑色的地砖,则将地砖标记为已经搜索过,然后搜索该黑色砖的四个临近地砖;如果该地砖是红色的或者搜素过的,则不再对该地砖进行搜索了。
1.2 代码
/*
*
* Introduction : ACM of pku
* ID : 1979
* alg : BFS
* Author : Gykimo
* Date : 20130105
*
*/
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
const char VISITED = '!'; //0x21
const char RED = '#'; //0x23
const char BLK = '.'; //0x2E
const char INI = '@'; //0x40
char tiles[20][20];
int w,h;
int init_row, init_col;
int num = 0;
void dfs(int row, int col){
if(tiles[row][col] < BLK || row < 0 || col < 0 || row >= h || col >= w)
return;
num++;
tiles[row][col] = VISITED;
dfs(row, col -1);
dfs(row - 1, col);
dfs(row, col + 1);
dfs(row + 1, col);
}
void get_init_position(){
bool getted = false;
for(int i=0; i<h; i++){
if(getted)
break;
for(int j=0; j<w; j++){
if(tiles[i][j] == INI){
init_row = i;
init_col = j;
getted = true;
break;
}
}
}
}
void readLine(){
char s[20] = {0};
while(1){
scanf("%d%d", &w, &h);
if(w==0 && h==0)
break;
for(int i=0; i<h; i++){
scanf("%s", s);
memcpy(&tiles[i][0], s, w);
}
num = 0;
get_init_position();
dfs(init_row, init_col);
printf("%d\n", num);
}
}
int main(){
readLine();
return 0;
}
1.3 运行结果
696K 16MS