将用字母表示的图转化成一个能读的图即可,即将每个字符所表示的图形表示成3*3的图,这样就得到了一个3*n*3*m的图,照着深搜即可
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
char arr[200][200];
char sen[60];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}, n, m;
void dfs(int x, int y){
int i, j, k, dx, dy;
arr[x][y] = '.';
for(i = 0; i < 4; i++){
dx = x + dir[i][0];
dy = y + dir[i][1];
if(1 <= dx && dx <= n && 1 <= dy && dy <= m && arr[dx][dy] == '@'){
dfs(dx, dy);
}
}
}
int main(){
int nn, mm, i, j, k, kx, ky, res;
while(scanf("%d %d", &nn, &mm) != EOF){
if(nn == -1 && mm == -1){
break;
}
n = nn * 3, m = mm * 3;
kx = ky = 1;
memset(arr, 0, sizeof(arr));
memset(sen, 0, sizeof(sen));
for(i = 1; i <= nn; i++){
scanf("%s", sen);
for(j = 0; j < mm; j++){
if(sen[j] == 'A'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'B'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'C'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'D'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'E'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'F'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'G'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'H'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'I'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'J'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '.';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
else if(sen[j] == 'K'){
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
arr[kx][ky] = '@';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '@';
arr[kx][ky] = '.';
arr[kx + 1][ky] = '@';
arr[kx + 2][ky++] = '.';
}
}
memset(sen, 0, sizeof(sen));
ky = 1, kx += 3;
}
// for(i = 1; i <= n; i++){
// for(j = 1; j <= m; j++){
// printf("%c", arr[i][j]);
// }
// printf("\n");
// }
res = 0;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
if(arr[i][j] == '@'){
dfs(i, j);
res++;
}
}
}
printf("%d\n", res);
}
return 0;
}