题意:给你一个矩形房间,判断有多少个房间,以及最大的房间,以及去掉一堵墙后最大的房间面积,以及是那一堵墙。
条件:输入的时候,输入的是房间的状态t,t由1或2或4或8组成。代表西,北,东,南有墙。看下二进制1 是00001, 2是00010, 4是00100, 8是01000。那么位运算很容易算出由哪些墙组成。
输出墙的时候,面积的优先级>靠西>靠南且方向只能有N和E组成,代表当要去除南边的墙的时候,得输出下面房间的N。
做的时候一直在纠结,去墙要怎么弄,枚举不就好了吗?每个墙试试,在算出这个强所在房间的面积。
/**
TASK: castle
ID: DickensTone
LANG: C++
**/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
bool vis[maxn][maxn];
bool wall[maxn][maxn][4];
int dir[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};
int m, n;
struct node
{
int x, y, d;
node()
{
x = y = d = -1;
}
}ans;
bool juge(int tx, int ty)
{
if(!vis[tx][ty]&& tx >= 1 && tx <= m && ty >= 1 && ty <= n)//
return true;
return false;
}
int dfs(int x, int y, int v)
{
vis[x][y] = 1;
//printf("%d %d\n", x, y);
for(int i = 0; i < 4; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(!wall[x][y][i] && juge(tx, ty))
v = dfs(tx, ty, v + 1);
}
return v;
}
int main()
{
freopen("castle.in", "r", stdin);
freopen("castle.out", "w", stdout);
while(scanf("%d%d", &n, &m) == 2)
{
memset(wall, 0, sizeof(wall));
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
int t;
scanf("%d", &t);
for(int k = 0; k < 4; k++)
{
if(1<<k & t) wall[i][j][k] = 1;
}
}
}
//print();
int cnt = 0, maxv = 0;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
{
if(!vis[i][j])
{
maxv = max(maxv, dfs(i, j, 1));
//printf("--------------\n");
//printf("%d %d %d\n", i, j, v);
cnt++;
}
}
int vmax = 0;
for(int j = 1; j <= n; j++)
for(int i = m; i >= 0; i--)
{
for(int k = 0; k < 4; k++)
{
if(wall[i][j][k])
{
//printf("yes\n");
memset(vis, 0, sizeof(vis));
wall[i][j][k] = 0;
int tv = dfs(i, j, 1);
if(tv > vmax)
{
vmax = tv;
ans.x = i;
ans.y = j;
ans.d = k;
}
//if(i == 4 && j == 2 && k == 0) printf("------------\n%d\n-------------\n", tv);
wall[i][j][k] = 1;
}
}
}
if(ans.d == 0) {ans.y--; ans.d = 2;}
else if(ans.d == 3) {ans.x++; ans.d = 1;}
printf("%d\n%d\n%d\n%d %d ", cnt, maxv, vmax, ans.x, ans.y);
if(ans.d == 1) printf("N\n");
else printf("E\n");
}
return 0;
}