Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
居然一次AC,分享下代码,仅供参考,140行C++,0ms#include<stdio.h> #include<memory.h> class Cluster { public: Cluster(int width, int height):width(width),height(height) { grid = new bool[width*height]; memset(grid,0,width*height*sizeof(bool)); } ~Cluster(){delete[]grid;} bool operator == (Cluster & obj); bool *grid; int width; int height; private: void HMirror() { bool temp; for(int i=0;i<height;i++) for(int j=0;j<width/2;j++) temp=grid[i*width+j],grid[i*width+j]=grid[i*width+width-j-1],grid[i*width+width-j-1]=temp; } void VMirror() { bool temp; for(int j=0;j<width;j++) for(int i=0;i<height/2;i++) temp=grid[i*width+j],grid[i*width+j]=grid[(height-1-i)*width+j],grid[(height-1-i)*width+j]=temp; } void Transpose() { int temp; bool *buf = new bool[width*height]; memcpy(buf,grid,width*height*sizeof(bool)); for(int i=0;i<height;i++) for(int j=0;j<width;j++) grid[j*height+i]=buf[i*width+j]; delete[]buf; temp=width; width=height; height=temp; } }; bool Cluster::operator ==(Cluster & obj) { if(!(height==obj.height && width==obj.width || height==obj.width && width==obj.height)) return false; for(int k=0;k<2;k++) { if(height!=width && height==obj.width && width==obj.height) Transpose(); if(0==memcmp(grid,obj.grid,height*width*sizeof(bool))) return true; HMirror(); if(0==memcmp(grid,obj.grid,height*width*sizeof(bool))) return true; VMirror(); if(0==memcmp(grid,obj.grid,height*width*sizeof(bool))) return true; HMirror(); if(0==memcmp(grid,obj.grid,height*width*sizeof(bool))) return true; if(height!=width)break; Transpose(); } return false; } int top,bottom,left,right,W,H; void bfs(unsigned char G[][100], int i, int j) { G[i][j]=2; if(j>0&&G[i][j-1]==1) bfs(G,i,j-1),left=j-1<left?j-1:left; if(j<W-1&&G[i][j+1]==1) bfs(G,i,j+1),right=j+1>right?j+1:right; if(i>0&&G[i-1][j]==1) bfs(G,i-1,j),top=i-1<top?i-1:top; if(i<H-1&&G[i+1][j]==1) bfs(G,i+1,j),bottom=i+1>bottom?i+1:bottom; } int main() { int t,n,i,j,k,x,y,nc[2]; unsigned char G[100][100]; Cluster *clusters[2][5000]; scanf("%d",&t); while(t--) { scanf("%d%d%d",&W,&H,&n); for(k=0;k<2;k++) { for(i=0;i<H;i++) for(j=0;j<W;j++) G[i][j]=0; for(j=0;j<n;j++) scanf("%d%d",&x,&y),G[y][x]=1; nc[k]=0; for(i=0;i<H;i++) for(j=0;j<W;j++) if(G[i][j]!=1) continue; else { left=right=j; top=bottom=i; bfs(G,i,j); clusters[k][nc[k]] = new Cluster(right-left+1,bottom-top+1); for(int ii=top;ii<=bottom;ii++) for(int jj=left;jj<=right;jj++) if(G[ii][jj]==2) clusters[k][nc[k]]->grid[(ii-top)*(right-left+1)+jj-left]=true,G[ii][jj]=3; nc[k]++; } } for(i=0;i<nc[0];i++) { for(j=0;j<nc[1];j++) { if(clusters[1][j]==NULL)continue; if(*clusters[0][i]==*clusters[1][j]) { delete clusters[1][j]; clusters[1][j]=NULL; break; } } if(j==nc[1])break; } if(i==nc[0])printf("YES\n"); else printf("NO\n"); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator