题意:识别图中的象形文字。但是,图形可以任意的拉伸,但不能拉断。
思路:图形任意可以拉伸,但不能拉断。这是个很蛋疼的条件。我们必须找到易于计算,满足上述条件的特征量。仔细观察后,可以发现,特征量就是每个字符中间有几个白洞。
我们就可以用DFS来对不同的联通块染成不同的颜色。(这个叫做Floodfill)
但是,如果区分外面的白洞和里面的白洞呢?我们可以这样,将整个图向外再扩一行(为了保证连通),全填为0。所以,我们就可以先染最外围的色(一定可以)。
同时,我们记录那些染色标号是对应文字的。然后,我们对于每个文字再次BFS,判断里面有多少白洞。
重复统计可以用bool数组,或者用set。
代码如下:
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXH = 210;
const int MAXW = 100;
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
char* bin[]= {"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"};
char code[] = "WAKJSD";
int W,H;
char pic1[MAXH][MAXW];
char pic[MAXH][MAXW<<2];
int color[MAXH][MAXW<<2];
void dfs(int x, int y, int col)
{
color[x][y] = col;
for(int i = 0; i < 4; ++i){
int xx = x + dx[i], yy = y + dy[i];
if(xx >= 0 && xx < H && yy >= 0 && yy < W
&& pic[x][y] == pic[xx][yy] && !color[xx][yy]){
dfs(xx,yy,col);
}
}
}
int main(void)
{
//freopen("input.txt","r",stdin);
int cas = 1;
while(scanf("%d %d", &H, &W), H || W){
memset(pic,0,sizeof(pic));
memset(color,0,sizeof(color));
for(int i = 0; i < H; ++i)
scanf("%s",pic1[i]);
for(int i = 0 ; i < H; ++i){
for(int j = 0; j < W; ++j){
if(isdigit(pic1[i][j]))
pic1[i][j] -= '0';
else
pic1[i][j] -= 'a' - 10;
for(int k = 0; k < 4; ++k)
pic[i+1][1 + 4 * j + k] = bin[pic1[i][j]][k] - '0';
}
}
H += 2;
W = 4 * W + 2;
int cnt = 0;
vector cc;
for(int i = 0; i < H; ++i){
for(int j = 0; j < W; ++j){
if(!color[i][j]){
dfs(i,j,++cnt);
if(pic[i][j] == 1) cc.push_back(cnt);
}
}
}
vector > neigh(cnt+1);
for(int i = 0; i < H; ++i){
for(int j = 0; j < W; ++j){
if(pic[i][j]){
for(int k = 0; k < 4; ++k){
int x = i + dx[k], y = j + dy[k];
if(x >= 0 && x < H && y >= 0 && y < W &&
pic[x][y] == 0 && color[x][y] != 1)
neigh[color[i][j]].insert(color[x][y]);
}
}
}
}
vector ans;
for(int i = 0, sz = cc.size(); i < sz; ++i)
ans.push_back(code[neigh[cc[i]].size()]);
sort(ans.begin(),ans.end());
printf("Case %d: ",cas++);
for(int i = 0, sz = ans.size(); i < sz; ++i)
printf("%c",ans[i]);
puts("");
}
return 0;
}