思路:现在空地上全部建蓝色的,找出独立块(被‘#’隔断互不联通),一个独立块只需要建一个蓝色房子那么其他的都可以摧毁再建红色房子。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 555
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std;
struct Node
{
int x,y;
bool first; //记录是否是某个独立块的第一个
};
int n,m,ans;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
char mp[maxn][maxn];
bool vis[maxn][maxn];
queue<Node>Q;
bool Isok(int x,int y)
{
if (x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y]=='.')
return true;
return false;
}
void dfs(int x,int y)
{
int i;
Node st;
FRL(i,0,4)
{
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if (Isok(dx,dy)&&!vis[dx][dy])
{
ans+=3; //先要建蓝色,再摧毁,再建红色,所以自增3
vis[dx][dy]=true;
st.x=dx,st.y=dy,st.first=false;
dfs(dx,dy);
Q.push(st);
}
}
}
int main()
{
int i,j;
while (~sff(n,m))
{
getchar();
FRE(i,1,n)
{
FRE(j,1,m)
scanf("%c",&mp[i][j]);
getchar();
}
mem(vis,false);
ans=0;
Node st;
FRE(i,1,n)
{
FRE(j,1,m)
{
if (!vis[i][j]&&mp[i][j]=='.')
{
ans++; //找到独立块的第一个,只需要建蓝色
vis[i][j]=true;
st.x=i,st.y=j,st.first=true;
dfs(i,j);
Q.push(st);
}
}
}
pf("%d\n",ans);
FRE(i,1,n)
FRE(j,1,m)
if (vis[i][j])
pf("B %d %d\n",i,j);
while (!Q.empty())
{
st=Q.front();
Q.pop();
if (!st.first)
{
pf("D %d %d\n",st.x,st.y);
pf("R %d %d\n",st.x,st.y);
}
}
}
return 0;
}