codeforces contest 327

来源:互联网 发布:淘宝网名昵称大全男 编辑:程序博客网 时间:2024/06/05 14:56
http://codeforces.com/contest/327

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

D 327D Block Tower

题意:给出一个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 << endlconst 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
0 0
原创粉丝点击