UVa 1103 - Ancient Messages (染色+dfs)
2017-04-10 19:12
393 查看
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<cstdlib> #include<stack> #include<set> #include<map> #include<vector> #include<queue> #include<sstream> #include<utility> #include<ctype.h> #define f(i, a, b) for(int i=a; i<b; i++) #define rf(i, a, b) for(int i=a; i>=b; i--) #define uf(i, a, b) for(i=a; i<b; i++) #define urf(i, a, b) for(i=a; i>=b; i--) #define cl(a, b) memset(a, b, sizeof(a)) #define pi acos(-1.0) #define sm 1e-10 #define inf 1e9 #define inf64 1e16 #define ll long long using namespace std; typedef pair<int,int> Pair; /* G++ 5.1.0 */ int pic[210][210]; int id[210][210]; int bin[16][4]; bool vis[210][210]; int n, m; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; char hol[6] = {'W','A','K','J','S','D'}; void setbin() { f(i, 0, 16) { int x = i; rf(j, 3, 0) bin[i][j] = (x&1), x >>=1; } } void dfs1(int x, int y, int mem, int id1) { if(x<0||x>=(n+2)||y<0||y>=(4*m+2)) return; if(vis[x][y]||pic[x][y]!=mem) return; vis[x][y] = true; id[x][y] = id1; f(i, 0, 4) dfs1(x+dir[i][0],y+dir[i][1], mem, id1); } void dfs2(int x, int y, int id1) { if(id[x][y]!=0) return; id[x][y] = id1; f(i, 0, 4) dfs2(x+dir[i][0], y+dir[i][1], id1); } int main() { setbin(); int kase = 1; while(scanf("%d %d", &n, &m) && n) { cl(pic, 0); f(i, 1, n+1) { char line[55]; scanf("%s", line+1); f(j, 1, m+1) { char c = line[j]; f(z, 0, 4) pic[i][4*j-3+z] = bin[c>='a'?(c-'a'+10):(c-'0')][z]; } } //将整个图用1,0表示,,并向外扩充一格 cl(vis, false); cl(id, 0); dfs1(0, 0, 0, -1); // 将外围的“白点”除掉 int cnt = 1; f(i, 1, n+1) { f(j, 1, 4*m+1) { if(pic[i][j]==1&&!id[i][j]) dfs1(i, j, 1, cnt++); } }//给不同的符号染色 int num[cnt+1]; cl(num, 0); int cur; f(i, 1, n+1) { f(j, 1, 4*m+1) { if(id[i][j]!=-1&&id[i][j]!=0) cur = id[i][j]; else //用cur标记符号id if(id[i][j]==0) { dfs2(i, j, cur); num[cur] ++; } } }//找洞 // f(i, 0, n+2) { // f(j, 0, 4*m+2) { // printf("%3d", id[i][j]); // } // printf("\n"); // } char res[55]; printf("Case %d: ", kase++); f(i, 1, cnt) res[i] = hol[num[i]]; sort(res+1, res+cnt); f(i, 1, cnt) printf("%c", res[i]); printf("\n"); } }
相关文章推荐
- uva 1103 dfs染色+dfs判断围块
- UVa 1103 - Ancient Messages (DFS)
- 紫书章六例题13 古代象形文字 UVA 1103(3次dfs,好题)
- UVa 1103 - Ancient Messages(DFS:Floodfill)
- 紫书章六例题13 古代象形文字 UVA 1103(3次dfs,好题)
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
- uva 193 Graph Coloring( 图染色 ) DFS+回溯
- 紫书章六例题13 古代象形文字 UVA 1103(3次dfs,好题)
- UVA 1103 Ancient Messages DFS
- 紫书章六例题13 古代象形文字 UVA 1103(3次dfs,好题)
- UVA11080- Place the Guards-(二分图染色)-dfs
- DFS染色解决区域分块问题UVALive 6663
- UVa 11396 - Claw Decomposition(二分图判定,染色法,dfs)
- [DFS]Ancient Messages, World Finals 2011, Uva1103
- uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
- UVA 193 Graph Coloring 图染色 DFS 数据
- uva 784 Maze Exploration 染色 搜索水题 DFS
- UVALive 6663 Count the Regions --离散化+DFS染色
- UVa 572 Oil Desposits (dfs 图 染色 八连通种子填充)
- uva 784 Maze Exploration 染色 搜索水题 DFS