兩個題是一個題~~只不過POJ的更弱些,只要找到房間數以及最大房間的面積就ok了...
首先是構造牆~~我是用個4位的bool數組來記錄每個點的牆的情況...讀入時就%2.再/2...就可以構造出來~~
找房間數和最大房間直接DFS就可以了~~邊遍曆邊標記~~每個點標記成所在的地區~~在遞迴的過程中很好實現~
而找去掉一面牆以及去掉一面牆最大面積~~就按所要求的優先順序枚舉牆~~判斷下兩邊是否為一個房間~~並且兩邊的和是否是最大的~~~
Program:
/* ID: zzyzzy12 LANG: C++ TASK: castle */ #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; struct node { bool s[4]; int data; }mar[55][55]; int n,m,i,j,k,t,Size[3001],MaxSize,RoomNum,ans,x,y; char f; void search(int y,int x) { if (mar[y][x].data) return; Size[RoomNum]++; mar[y][x].data=RoomNum; if (!mar[y][x].s[0]) search(y,x-1); if (!mar[y][x].s[1]) search(y-1,x); if (!mar[y][x].s[2]) search(y,x+1); if (!mar[y][x].s[3]) search(y+1,x); } int main() { freopen("castle.in","r",stdin); freopen("castle.out","w",stdout); scanf("%d%d",&m,&n); memset(mar,0,sizeof(mar)); for (i=1;i<=n;i++) for (j=1;j<=m;j++) { scanf("%d",&k); t=0; while (k) { if (k%2) mar[i][j].s[t]=true; k/=2; t++; } } MaxSize=RoomNum=0; for (i=1;i<=n;i++) for (j=1;j<=m;j++) if (!mar[i][j].data) { RoomNum++; Size[RoomNum]=0; search(i,j); if (Size[RoomNum]>MaxSize) MaxSize=Size[RoomNum]; } printf("%d\n%d\n",RoomNum,MaxSize); ans=0; for (j=1;j<=m;j++) for (i=n;i>=1;i--) { if (mar[i][j].s[0] && j!=1 && mar[i][j].data!=mar[i][j-1].data && ans<Size[mar[i][j].data]+Size[mar[i][j-1].data]) { y=i; x=j; f='W'; ans=Size[mar[i][j].data]+Size[mar[i][j-1].data]; } if (mar[i][j].s[1] && i!=1 && mar[i][j].data!=mar[i-1][j].data && ans<Size[mar[i][j].data]+Size[mar[i-1][j].data]) { y=i; x=j; f='N'; ans=Size[mar[i][j].data]+Size[mar[i-1][j].data]; } if (mar[i][j].s[2] && j!=m && mar[i][j].data!=mar[i][j+1].data && ans<Size[mar[i][j].data]+Size[mar[i][j+1].data]) { y=i; x=j; f='E'; ans=Size[mar[i][j].data]+Size[mar[i][j+1].data]; } if (mar[i][j].s[3] && i!=n && mar[i][j].data!=mar[i+1][j].data && ans<Size[mar[i][j].data]+Size[mar[i+1][j].data]) { y=i; x=j; f='S'; ans=Size[mar[i][j].data]+Size[mar[i+1][j].data]; } } printf("%d\n%d %d %c\n",ans,y,x,f); return 0; }