D. Block Tower (CF 327D 搜索)
来源:互联网 发布:5g网络上市公司 编辑:程序博客网 时间:2024/05/21 21:46
题意:在‘-’处建房子,蓝色的可容纳100人,红色的可容纳200人(建红色房子时旁边必须要有蓝色房子),要求输出人口最大的方案,任一一解即可。
思路:现在空地上全部建蓝色的,找出独立块(被‘#’隔断互不联通),一个独立块只需要建一个蓝色房子那么其他的都可以摧毁再建红色房子。
代码:
#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;}
2 0
- D. Block Tower (CF 327D 搜索)
- cf 327D Block Tower
- CodeForces 327D Block Tower(DFS)
- codeforces 327D Block Tower
- D. Block Tower
- CF 327D - Block Tower 数学题 DFS 初看很难,想通了就感觉很简单
- codeforces 327D. Block Tower(高级DFS)
- Codeforces 327D Block Tower【思维+Bfs】
- CodeForces Round #191 (327D) - Block Tower DFS
- Codeforces 327D Block Tower【BFS+优先队列】
- CF-13D - Two Paths(搜索)
- CF - 711D 搜索环
- Codeforces Round #191 (Div. 2) D. Block Tower
- Codeforces Round #191 (Div. 2) D. Block Tower
- D. Arthur and Walls (CF 525 D 搜索bfs)
- D. Drazil and Tiles (CF 515D bfs搜索)
- CF 432D(kmp)
- cf 337 D(dfs)
- (hdu step 6.1.2)Eddy's picture(在只给出二维坐标点的情况下,求让n个点连通的最小费用)
- discuz!本地论坛与手机版
- java之maven工程读取配置文件
- Merge Intervals && Insert Interval
- URAL 1349. Farm (费马大定理)
- D. Block Tower (CF 327D 搜索)
- Solaris 10 虚拟机探究(1)
- 并查集
- 使用ConfigParser模块解析配置文件
- JAVA内存使用--如何计算一个Java对象占用的字节数
- 隐藏物件
- 大数据 hadoop关系
- Ubuntu14.4 安装 Chrome
- 常用的邮箱服务器(SMTP、POP3)地址、端口