UVA 1103
2016-11-15 21:36
169 查看
这题有意思
运用特征量来处理是哪个字符
好不容易把题意读懂却不知道怎么处理黑色像素里面的联通块
最开始读题说每个字符都不互相接触也不包含, 那么我可以找一个最小矩阵包含这个字符, 然后在去找联通块
当然首先得预处理那些包含字符的整个大联通块, 如果直接dfs2(0, 0)是不对的 比如第一个字符它横跨整个一行就处理不出来了
所以在给定的n*m矩阵外再加一圈, 这样能使的整个字符外的点联通.
那么在找黑色像素dfs中如果碰到白色像素 那么就是dfs2 ,找出被围的整个白色像素,此时白色联通块+1
那么就解决了
在dfs中再嵌套一个dfs 666
注意在dfs的时候注意边界是不一样的
运用特征量来处理是哪个字符
好不容易把题意读懂却不知道怎么处理黑色像素里面的联通块
最开始读题说每个字符都不互相接触也不包含, 那么我可以找一个最小矩阵包含这个字符, 然后在去找联通块
当然首先得预处理那些包含字符的整个大联通块, 如果直接dfs2(0, 0)是不对的 比如第一个字符它横跨整个一行就处理不出来了
所以在给定的n*m矩阵外再加一圈, 这样能使的整个字符外的点联通.
那么在找黑色像素dfs中如果碰到白色像素 那么就是dfs2 ,找出被围的整个白色像素,此时白色联通块+1
那么就解决了
在dfs中再嵌套一个dfs 666
注意在dfs的时候注意边界是不一样的
#include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <cctype> #include <iostream> #include <sstream> using namespace std; const int qq = 200*5; int map[qq][qq]; char flag[30]; int row, col, cnt; void handle(int i, int y, int &x){ for(int l = 3; l >= 0; --l){ if(y&(1<<l)) map[i][x++] = 1; else map[i][x++] = 0; } } void dfs2(int x, int y){ if(x < 0 || y < 0 || x > row+1 || y > col+1) return; if(map[x][y] != 0) return; map[x][y] = -1; dfs2(x+1, y); dfs2(x-1, y); dfs2(x, y+1); dfs2(x, y-1); } void dfs(int x, int y){ if(x < 0 || y < 0 || x > row || y > col) return; if(map[x][y] == -1) return; if(map[x][y] == 0){ cnt ++; dfs2(x, y); return; } map[x][y] = -1; dfs(x+1, y); dfs(x-1, y); dfs(x, y+1); dfs(x, y-1); } int main(){ flag[1] = 'A', flag[3] = 'J', flag[5] = 'D', flag[4] = 'S', flag[0] = 'W', flag[2] = 'K'; int n, m; int cas = 1; while(scanf("%d%d", &n, &m)!=EOF){ getchar(); if(!n && !m) break; memset(map, 0, sizeof(map)); string str; for(int i = 1; i <= n; ++i){ getline(cin, str); int k = 1; for(int j = 1; j <= str.size(); ++j){ if(isdigit(str[j-1])) handle(i, str[j-1]-'0', k); else handle(i, str[j-1]-'a'+10, k); } } row = n, col = 4*m; dfs2(0, 0); string tar; for(int i = 1; i <= row; ++i) for(int j = 1; j <= col; ++j) if(map[i][j] == 1){ cnt = 0; dfs(i, j); tar += flag[cnt]; } sort(tar.begin(), tar.end()); cout << "Case " << cas++ << ": " << tar << endl; } return 0; }
相关文章推荐
- uva 1103 dfs染色+dfs判断围块
- UVA - 1103 Ancient Messages dfs+stl
- UVa 1103 (利用连通块来判断字符) Ancient Messages
- 紫书章六例题13 古代象形文字 UVA 1103(3次dfs,好题)
- UVA 1103 象形符号
- Uva1103 World finals 2011——Ancient Messages
- uva 1103 紫书例题6-13(dfs)
- UVA - 1103:Ancient Messages
- 紫书章六例题13 古代象形文字 UVA 1103(3次dfs,好题)
- UVa1103古代象形符号
- 6_13古代象形符号(UVa1103)<图的连通块的应用>
- 【例题 6-13 UVA - 1103】Ancient Messages
- UVa 1103 - Ancient Messages (染色+dfs)
- UVA-1103 Ancient Messages
- uva 1103 详解
- uva 1103 Ancient Messages (古象形文字)
- UVA - 1103 Ancient Messages(三组数据)
- UVa 1103 - Ancient Messages (DFS)
- UVA 1103 How Many O's?
- UVa1103 - Ancient Messages