- The image contains only hieroglyphs shown in Figure C.1.
- Each image contains at least one valid hieroglyph.
- Each black pixel in the image is part of a valid hieroglyph.
- Each hieroglyph consists of a connected set of black pixels and each black pixel has at least one other black pixel on its top, bottom, left, or right side.
- The hieroglyphs do not touch and no hieroglyph is inside another hieroglyph.
- Two black pixels that touch diagonally will always have a common touching black pixel.
- The hieroglyphs may be distorted but each has a shape that is topologically equivalent to one of the symbols in Figure C.11.
The last test case is followed by a line containing two zeros.
1Two figures are topologically equivalent if each can be transformed into the other by stretching without tearing.
Ankh: A
Wedjat: J
Djed: D
Scarab: S
Was: W
Akhet: K
In each output string, print the codes in alphabetic order. Follow the format of the sample output.
The sample input contains descriptions of test cases shown in Figures C.2 and C.3. Due to space constraints not all of the sample input can be shown on this page.
思路:依据圈的数量来识别。
#include <cstdio> #include <algorithm> using namespace std; char ts[201],mes[6]={'W','A','K','J','S','D'},ans[10]; bool vis[205][205]; int n,m,mp[205][205],nxt[4][2]={{1,0},{0,1},{-1,0},{0,-1}},num; void dfs(int x,int y) { int i; for(i=0;i<4;i++) { x+=nxt[i][0]; y+=nxt[i][1]; if(x>=0 && x<n && y>=0 && y<m && !vis[x][y] && !mp[x][y]) { vis[x][y]=1; dfs(x,y); } x-=nxt[i][0]; y-=nxt[i][1]; } } void dfs3(int x,int y) { int i; for(i=0;i<4;i++) { x+=nxt[i][0]; y+=nxt[i][1]; if(x>=0 && x<n && y>=0 && y<m && !vis[x][y] && !mp[x][y]) { vis[x][y]=1; dfs3(x,y); } x-=nxt[i][0]; y-=nxt[i][1]; } } void dfs2(int x,int y) { int i; for(i=0;i<4;i++) { x+=nxt[i][0]; y+=nxt[i][1]; if(x>=0 && x<n && y>=0 && y<m && !vis[x][y]) { if(mp[x][y]) { vis[x][y]=1; dfs2(x,y); } else { vis[x][y]=1; num++; dfs3(x,y); } } x-=nxt[i][0]; y-=nxt[i][1]; } } int main() { int i,j,t,casenum=1,cnt; while(~scanf("%d%d",&n,&m) && n) { n++; m*=4; m++; for(i=0;i<=n;i++) for(j=0;j<=m;j++) vis[i][j]=0; for(i=1;i<n;i++) { gets(ts); if(!ts[0]) { i--; continue; } for(j=0;ts[j];j++) { if(ts[j]>='a' && ts[j]<='f') { t=ts[j]-'a'+10; mp[i][j*4+1]=t/8; mp[i][j*4+2]=t%8/4; mp[i][j*4+3]=t%4/2; mp[i][j*4+4]=t%2/1; } else { t=ts[j]-'0'; mp[i][j*4+1]=t/8; mp[i][j*4+2]=t%8/4; mp[i][j*4+3]=t%4/2; mp[i][j*4+4]=t%2/1; } } } for(i=0;i<=m;i++) mp[n][i]=0; for(i=0;i<=n;i++) mp[i][m]=0; n++; m++; vis[0][0]=1; dfs(0,0); cnt=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(mp[i][j] && !vis[i][j]) { num=0; vis[i][j]=1; dfs2(i,j); ans[cnt++]=mes[num]; } } } sort(ans,ans+cnt); ans[cnt]=0; printf("Case %d: ",casenum++); puts(ans); } }
版权声明:本文博客原创文章,博客,未经同意,不得转载。