在移除房间北墙的时候忘了移除该房间北邻的南墙,wa了一次,注意移墙时的搜索顺序:自底向上,自左向右。
/* ID:chenjiong PROG:castle LANG:C++ */ #include <stdio.h> #include <string.h> const int MAXN = 55; typedef struct { int dir[4][3]; //西北东南 }POS; typedef struct { int x; int y; char d; int size; }WALL; int M,N; POS map[MAXN][MAXN]; bool vis[MAXN][MAXN]; int area; //the size of a certain room int cnt; //the number of rooms WALL result; bool is_in(int x,int y) { if ( x >= 1 && x <= N && y >= 1 && y <= M ) return true; return false; } void init(POS& x,int wall) { switch ( wall ) { case 0 : break; case 1 : x.dir[0][2] = 0; break; case 2 : x.dir[1][2] = 0; break; case 4 : x.dir[2][2] = 0; break; case 8 : x.dir[3][2] = 0; break; case 3 : x.dir[0][2] = x.dir[1][2] = 0; break; case 5 : x.dir[0][2] = x.dir[2][2] = 0; break; case 9 : x.dir[0][2] = x.dir[3][2] = 0; break; case 6 : x.dir[1][2] = x.dir[2][2] = 0; break; case 10 : x.dir[1][2] = x.dir[3][2] = 0; break; case 12 : x.dir[2][2] = x.dir[3][2] = 0; break; case 7 : x.dir[0][2] = x.dir[1][2] = x.dir[2][2] = 0; break; case 11 : x.dir[0][2] = x.dir[1][2] = x.dir[3][2] = 0; break; case 13 : x.dir[0][2] = x.dir[2][2] = x.dir[3][2] = 0; break; case 14 : x.dir[1][2] = x.dir[2][2] = x.dir[3][2] = 0; break; case 15 : x.dir[0][2] = x.dir[1][2] = x.dir[2][2] = x.dir[3][2] = 0; break; } } void dfs(int x,int y) { vis[x][y] = true; area++; int xx,yy; int i; for ( i = 0; i < 4; i++) { if ( map[x][y].dir[i][2] == 1 ) { xx = x + map[x][y].dir[i][0]; yy = y + map[x][y].dir[i][1]; if ( is_in(xx,yy) && !vis[xx][yy] ) dfs(xx,yy); } } } int floodfill() { memset(vis,0,sizeof(vis)); int max = 0; int i,j; for ( i = 1; i <= N; i++) { for ( j = 1; j <= M; j++) { if ( !vis[i][j] ) { area = 0; cnt++; dfs(i,j); if ( area > max ) max = area; } } } return max; } void remove(int x,int y,const char d) { if ( d == 'N' ) { if ( map[x][y].dir[1][2] == 1 ) return; else { map[x][y].dir[1][2] = 1; map[x - 1][y].dir[3][2] = 1; int tmp = floodfill(); if ( tmp > result.size ) { result.x = x; result.y = y; result.d = 'N'; result.size = tmp; } map[x][y].dir[1][2] = 0; map[x - 1][y].dir[3][2] = 0; } } else { if ( map[x][y].dir[2][2] == 1 ) return; else { map[x][y].dir[2][2] = 1; map[x][y + 1].dir[0][2] = 1; int tmp = floodfill(); if ( tmp > result.size ) { result.x = x; result.y = y; result.d = 'E'; result.size = tmp; } map[x][y].dir[2][2] = 0; map[x][y + 1].dir[0][2] = 0; } } } int main() { freopen("castle.in","r",stdin); freopen("castle.out","w",stdout); int i,j; for ( i = 0; i < MAXN; i++) { for ( j = 0; j < MAXN; j++) { map[i][j].dir[0][0] = 0; map[i][j].dir[0][1] = -1; map[i][j].dir[0][2] = 1; map[i][j].dir[1][0] = -1; map[i][j].dir[1][1] = 0; map[i][j].dir[1][2] = 1; map[i][j].dir[2][0] = 0; map[i][j].dir[2][1] = 1; map[i][j].dir[2][2] = 1; map[i][j].dir[3][0] = 1; map[i][j].dir[3][1] = 0; map[i][j].dir[3][2] = 1; } } scanf("%d%d",&M,&N); int tmp; for ( i = 1; i <= N; i++) { for ( j = 1; j <= M; j++) { scanf("%d",&tmp); init(map[i][j],tmp); } } int ans = floodfill(); printf("%d\n%d\n",cnt,ans); for ( j = 1; j <= M; j++) { for ( i = N; i >= 1; i--) { remove(i,j,'N'); remove(i,j,'E'); } } printf("%d\n%d %d %c\n",result.size,result.x,result.y,result.d); return 0; }