Portal:http://codeforces.com/problemset/problem/327/D

一座红塔200人,一座蓝塔100人,只有与蓝塔相邻才可以建红塔。

'.'处可建塔 '#'处不可建塔

可以随便毁塔

在建造能够容纳最多人数的塔集合情况下,输出对塔的操作(SPJ)

这是一道水题

这是一道卡输入输出的题

DFS就好,反正就是在联通分量里炸割顶留根

 #include<iostream>
#include<algorithm>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define FORD(i,j,k) for(int i=j;i>=k;i--)
#define LL long long
#define SZ(x) int(x.size())
#define maxm 510
#define maxn 510
string x;
int dx[]={,,-,};
int dy[]={,,,-};
int m,n,sum;
vector<char> al;
vector<int> ax,ay;
char ii[maxm][maxn];
int a[maxm][maxn],vis[maxm][maxn],col[maxm][maxn];
bool cr(int xx,int yy)
{
FOR(i,,)
if(xx+dx[i]>&&xx+dx[i]<=m&&yy+dy[i]>&&yy+dy[i]<=n)
if(col[xx+dx[i]][yy+dy[i]]==) return true;
return false;
}
void dfs(int x,int y)
{
vis[x][y]=;
/*if(cr(x,y)) {al.push_back('R');ax.push_back(x);ay.push_back(y);col[x][y]=2;sum++;}
else */{al.push_back('B');ax.push_back(x);ay.push_back(y);col[x][y]=;sum++;}
FOR(i,,)
if(x+dx[i]>&&x+dx[i]<=m&&y+dy[i]>&&y+dy[i]<=n)
if(a[x+dx[i]][y+dy[i]]) if(!vis[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i]);
if(col[x][y]==) if(cr(x,y)) { al.push_back('D');ax.push_back(x);ay.push_back(y);
al.push_back('R');ax.push_back(x);ay.push_back(y);col[x][y]=;sum+=;}
}
int main()
{
cin>>m>>n;
FOR(i,,m)
{scanf("%s",&ii[i][]);
FOR(j,,n)
{
a[i][j]=(ii[i][j]=='.');
}
}
FOR(i,,m)
FOR(j,,n)
if(a[i][j]&&!vis[i][j]) dfs(i,j);
cout<<sum<<endl;
FOR(i,,SZ(al)-)
printf("%c %d %d\n",al[i],ax[i],ay[i]);
return ;
}

特别丑的原代码(AC)

 #include<iostream>
#include<algorithm>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<sstream>
using namespace std;
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define FORD(i,j,k) for(int i=j;i>=k;i--)
#define LL long long
#define SZ(x) int(x.size())
#define maxm 510
#define maxn 510
char x;
stringstream ans;
int dx[]={,,-,};
int dy[]={,,,-};
int m,n,sum;
char ii[maxm][maxn];
int a[maxm][maxn],vis[maxm][maxn],col[maxm][maxn];
bool cr(int xx,int yy)
{
FOR(i,,)
if(xx+dx[i]>&&xx+dx[i]<=m&&yy+dy[i]>&&yy+dy[i]<=n)
if(col[xx+dx[i]][yy+dy[i]]==) return true;
return false;
}
void dfs(int x,int y)
{
vis[x][y]=;
ans<<"B "<<x<<' '<<y<<"\n";col[x][y]=;sum++;
FOR(i,,)
if(x+dx[i]>&&x+dx[i]<=m&&y+dy[i]>&&y+dy[i]<=n)
if(a[x+dx[i]][y+dy[i]]) if(!vis[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i]);
if(col[x][y]==) if(cr(x,y)) { ans<<"D "<<x<<' '<<y<<"\n";
ans<<"R "<<x<<' '<<y<<"\n";col[x][y]=;sum+=;}
}
int main()
{
cin>>m>>n;
FOR(i,,m)
FOR(j,,n)
{
cin>>x;
a[i][j]=(x=='.');
}
FOR(i,,m)
FOR(j,,n)
if(a[i][j]&&!vis[i][j]) dfs(i,j);
cout<<sum<<endl;
cout<<ans.str();
return ;
}

改后依然很丑的代码

输出黑科技sstream orz

#include<sstream> x;
x<<.....;
cout<<x.str();

输入黑科技

scanf("%s",&string[i][]);

CoderForces 327D Block Tower的更多相关文章

  1. CF 327D - Block Tower 数学题 DFS 初看很难,想通了就感觉很简单

    D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. CodeForces - 327D Block Tower

    D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  3. Codeforces Round #191 (Div. 2) D. Block Tower

    D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  4. 2013/7/16 HNU_训练赛4

    CF328B Sheldon and Ice Pieces 题意:给定一个数字序列,问后面的数字元素能够组成最多的组数. 分析:把2和5,6和9看作是一个元素,然后求出一个最小的组数就可以了. #in ...

  5. CF 191 总结

    A. Flipping Game 链接:http://codeforces.com/contest/327/problem/A 题意:从 i 到 j 翻转一次使得 1 的 个数最多~ 直接暴力搞~ # ...

  6. Codeforces Round #191 (Div. 2)

    在div 188中,幸运的达成了这学期的一个目标:CF1800+,所以这次可以打星去做div2,有点爽. A.Flipping Game 直接枚举 B. Hungry Sequence 由于素数的分布 ...

  7. [Swust OJ 893]--Blocks

    题目链接:http://acm.swust.edu.cn/problem/893/ Time limit(ms): 1000 Memory limit(kb): 65535   Josh loves ...

  8. UVa 437 The Tower of Babylon(经典动态规划)

    传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...

  9. UVa 437 The Tower of Babylon

    Description   Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...

随机推荐

  1. JavaScript判断一个对象是否为空

    本文介绍了判断一个对象是否为空的几种方法 测试用例 test1 = 1; test2 = {}; test3 = {a:1,b:2} 1. 判断Object.keys()的长度 function _i ...

  2. 容器内init进程方案

    背景 进程标识符 (PID) 是Linux 内核为每个进程提供的唯一标识符.熟悉docker的同学都知道, 所有的进程 PID都属于某一个PID namespaces, 也就是说容器具有一组自己的 P ...

  3. Thead基础及两种创建方式

    今天本人给大家讲解一下多线程,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 说说多线程本人自己对它理解的定义:因计算机的CPU支持能够在同一时间执行多于一 ...

  4. 03 Hibernate入门

    Hibernate 说明 由于JPA是sun公司制定的API规范,所以我们不需要导入额外的JPA相关的jar包,只需要导入JPA的提供商的jar包.我们选择Hibernate作为JPA的提供商,所以需 ...

  5. Linux下git使用

    一.安装 本人使用的是centos 7,首先安装git 1.下载git:wget https://Github.com/Git/Git/archive/v2.3.0.tar.gz 2.下载之后解压:t ...

  6. [BlueZ] 3、使用 meshctl 连接控制一个 sig mesh 灯

    目录 前言 1.准备工作 2.meshctl 连接.配置.控制 sig mesh 灯 3.最终效果: LINKS 前言 本文介绍如何使用 meshctl 配对.连接.控制一个 sig mesh 球泡灯 ...

  7. js 实现简单的选项卡

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. tempdb 日志文件增长的问题

    前两天在一个客户那里发现tempdb log 文件增长很大,已经使用40GB了,而tempdb log 文件总的分配空间是70GB,并且日志空间貌似不能重用,他们使用sql 2012 打的sp4补丁, ...

  9. 数据挖掘入门系列教程(五)之Apriori算法Python实现

    数据挖掘入门系列教程(五)之Apriori算法Python实现 加载数据集 获得训练集 频繁项的生成 生成规则 获得support 获得confidence 获得Lift 进行验证 总结 参考 数据挖 ...

  10. 1.JVM中的五大内存区域划分详解及快速扫盲

    本博客参考<深入理解Java虚拟机>这本书 视频及电子书详见:https://shimo.im/docs/HP6qqHx38xCJwcv9/ 一.快速扫盲 1. JVM是什么   JVM是 ...