题目链接:https://cn.vjudge.net/problem/UVA-1103
题意:有6种象形符号,给出一个矩阵,字符为16进制形式,转化为2进制后1代表黑点,0代表白点,按照字典序输出所以符号。
思路:观察这6种符号,可以看出每种符号所包裹的白色的洞是不同的,所以我们根据白洞的数目来区别字符。首先,把矩阵转化为2进制,我们需要把矩阵增加一层全为白色像素点的外壳,这是为了我们对(0,0)这个点深搜1次就可以把所以的不被黑色像素点包围即白洞之外的所有白色像素点给标记出来,我们把这些点标记为-1,意思是不可访问了,然后枚举所有黑色像素点,对每一个黑色像素点深搜,如果遇到白色的点,说明有一个白洞,然后对这个白色的点深搜,把白洞内所有的点标记为-1,每枚举一个黑色像素点,根据白洞的个数判符号种类。
#include <cstdio>
#include <cstring>
const int maxn = 250;
int mp[maxn][maxn],num[6];
char bin[maxn][5],f[6] = {'A', 'D', 'J', 'K', 'S', 'W'};
int h,w,cnt;
bool read()
{
scanf("%d%d",&h,&w);
if(h == 0 && w == 0){
return false;
}
memset(mp,0,sizeof(mp));
memset(num,0,sizeof(num));
for(int i = 1; i <= h; i++){
getchar();
int pos = 1;
for(int j = 1; j <= w; j++){
char c = getchar();
for(int k = 0; k <= 3; k++){
mp[i][pos++] = bin[c][k] - '0';
}
}
}
w = w * 4 + 1;
h++;
}
void dfs1(int x,int y)
{
if(x < 0 || y < 0 || x > h || y > w || mp[x][y] != 0){
return;
}
mp[x][y] = -1;
dfs1(x - 1,y);
dfs1(x + 1,y);
dfs1(x,y + 1);
dfs1(x,y - 1);
}
void dfs2(int x,int y)
{
if(x < 0 || y < 0 || x > h || y > w || mp[x][y] == -1){
return;
}
if(mp[x][y] == 0){
cnt++;
dfs1(x,y);
return;
}
mp[x][y] = -1;
dfs2(x - 1,y);
dfs2(x + 1,y);
dfs2(x,y + 1);
dfs2(x,y - 1);
}
int main(void)
{
strcpy(bin['0'], "0000");
strcpy(bin['1'], "0001");
strcpy(bin['2'], "0010");
strcpy(bin['3'], "0011");
strcpy(bin['4'], "0100");
strcpy(bin['5'], "0101");
strcpy(bin['6'], "0110");
strcpy(bin['7'], "0111");
strcpy(bin['8'], "1000");
strcpy(bin['9'], "1001");
strcpy(bin['a'], "1010");
strcpy(bin['b'], "1011");
strcpy(bin['c'], "1100");
strcpy(bin['d'], "1101");
strcpy(bin['e'], "1110");
strcpy(bin['f'], "1111");
int Case = 0;
while(read()){
dfs1(0,0);
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
if(mp[i][j] == 1){
cnt = 0;
dfs2(i,j);
if(cnt == 1){
num[0]++;
}
else if(cnt == 3){
num[2]++;
}
else if(cnt == 5){
num[1]++;
}
else if(cnt == 4){
num[4]++;
}
else if(cnt == 0){
num[5]++;
}
else{
num[3]++;
}
}
}
}
printf("Case %d: ",++Case);
for(int i = 0; i <= 5; i++){
while(num[i]){
printf("%c",f[i]);
num[i]--;
}
}
printf("\n");
}
return 0;
}