http://codeforces.com/contest/327
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意:给出一个n*m的地图,初始每个格子不是空的就是坏的,你可以在空的格子上执行操作
1,建蓝色的建筑,可容纳100人
2,建红色的建筑(必须建在蓝色建筑旁边),可容纳200人
3,摧毁建筑
总操作数有限,求能让最后总人口最多的建造方案
题解:虽然限定了总操作数,但是算一下就发现给出的操作数足够在每个格子上操作三次。
先在所有格子上建蓝色建筑,然后dfs每一个联通块,回溯的时候再把红色建筑建上。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
const int N=505;
char s[N][N];
int vis[N][N];
struct Ans {
char ch;
int x,y;
}ans[1000005];
int cnt,n,m;
void dfs(int x,int y) {
vis[x][y]=1;
if(!vis[x-1][y]&&s[x-1][y]=='B') dfs(x-1,y);
if(!vis[x+1][y]&&s[x+1][y]=='B') dfs(x+1,y);
if(!vis[x][y-1]&&s[x][y-1]=='B') dfs(x,y-1);
if(!vis[x][y+1]&&s[x][y+1]=='B') dfs(x,y+1);
s[x][y]='R';
ans[++cnt].ch='D';
ans[cnt].x=x;
ans[cnt].y=y;
ans[++cnt].ch='R';
ans[cnt].x=x;
ans[cnt].y=y;
}
void doing(int x,int y) {
vis[x][y]=1;
if(!vis[x-1][y]&&s[x-1][y]=='B') dfs(x-1,y);
if(!vis[x+1][y]&&s[x+1][y]=='B') dfs(x+1,y);
if(!vis[x][y-1]&&s[x][y-1]=='B') dfs(x,y-1);
if(!vis[x][y+1]&&s[x][y+1]=='B') dfs(x,y+1);
}
int main() {
while(~scanf("%d%d",&n,&m)) {
for(int i=1;i<=n;++i) {
scanf("%s",s[i]+1);
s[i][0]='#';s[i][m+1]='#';
}
for(int i=0;i<=m+1;++i) {
s[0][i]='#';
s[n+1][i]='#';
}
cnt=0;
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
if(s[i][j]=='.') {
s[i][j]='B';
ans[++cnt].ch='B';
ans[cnt].x=i;
ans[cnt].y=j;
}
}
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
if(s[i][j]=='B'&&!vis[i][j]) {
doing(i,j);
}
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;++i) printf("%c %d %d\n",ans[i].ch,ans[i].x,ans[i].y);
}
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E
http://blog.csdn.net/qq_32707623/article/details/53340236