ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题。
ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3944
In a BG (dinner gathering) for ZJU ICPC team, the coaches wanted to count the number of people present at the BG. They did that by having the waitress take a photo for them. Everyone was in the photo and no one was completely blocked. Each person in the photo has the same posture. After some preprocessing, the photo was converted into a H×W character matrix, with the background represented by ".". Thus a person in this photo is represented by the diagram in the following three lines:
.O.
/|\
(.)
Given the character matrix, the coaches want you to count the number of people in the photo. Note that if someone is partly blocked in the photo, only part of the above diagram will be presented in the character matrix.
Input
There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:
The first contains two integers H, W (1 ≤ H, W ≤ 100) - as described above, followed by H lines, showing the matrix representation of the photo.
Output
For each test case, there should be a single line, containing an integer indicating the number of people from the photo.
Sample Input
2
3 3
.O.
/|\
(.)
3 4
OOO(
/|\\
()))
Sample Output
1
4 /////////////////////////////////////////////////////////////////////////
刚读完题的我是无比懵逼的。。。
冷静下来,发现有几点对解题还是有用的。
1 每个人都至少有一部分漏出来。
2 大家的站姿相同,也就是说,每个人躯体的各个部分的相对位置是确定的。如果你找到了一只手,那么在确定的地方可能会出现这个人的另一只手。。。 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <stdlib.h>
# define MAXN 110
typedef long long int LL;
using namespace std; char in[MAXN][MAXN];
int t, p, w;
int head[5][2] = {{1,-1}, {1,0}, {1,1}, {2,-1}, {2,1}};
char headwing[6] = {"/|\\()"};
int leftarm[5][2] = {{-1,1}, {0,1}, {0,2}, {1,0}, {1,2}};
char leftarmwing[6] = {"O|\\()"};
int mid[5][2] = {{-1,0}, {0,-1}, {0,1}, {1,-1}, {1,1}};
char midwing[6] = {"O/\\()"};
int rightarm[5][2] = {{-1,-1}, {0,-2}, {0,-1}, {1,-2}, {1,0}};
char rightarmwing[6] = {"O/|()"};
int leftleg[5][2] = {{-2,1}, {-1,0}, {-1,1}, {-1,2}, {0,2}};
char leftlegwing[6] = {"O/|\\)"};
int rightleg[5][2] = {{-2,-1}, {-1,-2}, {-1,-1}, {-1,0}, {0,-2}};
char rightlegwing[6] = {"O/|\\("}; void check(int i, int j){
int k = 0, x, y;
if(in[i][j] == 'O'){
for(k=0; k<5; ++k){
x = i + head[k][0];
y = j + head[k][1];
if(x < 0 || x>=p || y<0 || y>=w){
continue;
}else{
if(in[x][y] == headwing[k]){
in[x][y] = '.';
}
}
}
}else if(in[i][j] == '/'){
for(k=0; k<5; ++k){
x = i + leftarm[k][0];
y = j + leftarm[k][1];
if(x < 0 || x>=p || y<0 || y>=w){
continue;
}else{
if(in[x][y] == leftarmwing[k]){
in[x][y] = '.';
}
}
}
}else if(in[i][j] == '|'){
for(k=0; k<5; ++k){
x = i + mid[k][0];
y = j + mid[k][1];
if(x < 0 || x>=p || y<0 || y>=w){
continue;
}else{
if(in[x][y] == midwing[k]){
in[x][y] = '.';
}
}
}
}else if(in[i][j] == '\\'){
for(k=0; k<5; ++k){
x = i + rightarm[k][0];
y = j + rightarm[k][1];
if(x < 0 || x>=p || y<0 || y>=w){
continue;
}else{
if(in[x][y] == rightarmwing[k]){
in[x][y] = '.';
}
}
}
}else if(in[i][j] == '('){
for(k=0; k<5; ++k){
x = i + leftleg[k][0];
y = j + leftleg[k][1];
if(x < 0 || x>=p || y<0 || y>=w){
continue;
}else{
if(in[x][y] == leftlegwing[k]){
in[x][y] = '.';
}
}
}
}else if(in[i][j] == ')'){
for(k=0; k<5; ++k){
x = i + rightleg[k][0];
y = j + rightleg[k][1];
if(x < 0 || x>=p || y<0 || y>=w){
continue;
}else{
if(in[x][y] == rightlegwing[k]){
in[x][y] = '.';
}
}
}
}
return ;
}
int main(){
//freopen("in.txt", "r", stdin);
scanf("%d", &t);
while( t-- ){
scanf("%d%d", &p, &w);
getchar();
memset(in, 0, sizeof(in));
for(int i=0; i<p; ++i){
for(int j=0; j<w; ++j){
scanf("%c", &in[i][j]);
}
getchar();
}
int ans = 0;
for(int i=0; i<p; ++i){
for(int j=0; j<w; ++j){
if(in[i][j] == '.'){
continue;
}else{
ans ++;
check(i,j);
in[i][j] = '.';
}
}
}
cout << ans << endl;
} return 0;
} // 代码写的这么长,真的很抱歉 :(。
ZOJ People Counting的更多相关文章
- [ACM_暴力][ACM_几何] ZOJ 1426 Counting Rectangles (水平竖直线段组成的矩形个数,暴力)
Description We are given a figure consisting of only horizontal and vertical line segments. Our goal ...
- ZOJ 2392 The Counting Problem(模拟)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1368 题目大意:计算从S到T中所有的数,其中0,1,2,3,4,5, ...
- zoj 1610 Count the Colors
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=610 Count the Colors Time Limit:2000MS ...
- ZOJ 3080 ChiBi(spfa)
ZOJ Problem Set - 3080 ChiBi Time Limit: 5 Seconds Memory Limit: 32768 KB watashi's mm is so pr ...
- zoj 3286 Very Simple Counting---统计[1,N]相同因子个数
Very Simple Counting Time Limit: 1 Second Memory Limit: 32768 KB Let f(n) be the number of fact ...
- ZOJ 1610.Count the Colors-线段树(区间染色、区间更新、单点查询)-有点小坑(染色片段)
ZOJ Problem Set - 1610 Count the Colors Time Limit: 2 Seconds Memory Limit: 65536 KB Painting s ...
- TOJ 1258 Very Simple Counting
Description Let f(n) be the number of factors of integer n. Your task is to count the number of i(1 ...
- ZOJ 1610——Count the Colors——————【线段树区间替换、求不同颜色区间段数】
Count the Colors Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Subm ...
- zoj 1610 Count the Colors 【区间覆盖 求染色段】
Count the Colors Time Limit: 2 Seconds Memory Limit: 65536 KB Painting some colored segments on ...
随机推荐
- Git(进击学习:远程仓库操作)-V3.0
1.查看当前的远程仓库:git remote或git remote -v 2.添加远程仓库:git remote add [shortname] [url] git remote add pb git ...
- 基于MySQL MEB的备份恢复
MEB(MySQL Enterprise Backup)是MySQL商业版中提供的备份工具,属于物理备份. 同XtraBackup一样,mysqlbackup的使用过程同样包含如下三个步骤: 备份(- ...
- SQL Tuning 基础概述04 - Oracle 表的类型及介绍
Tables A table describes an entity such as employees. You define a table with a table name, such as ...
- C# Invoke或者BeginInvoke的使用
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...
- ASP.NET五步打包下载Zip文件
本文版权归博客园和作者吴双共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 首先分享几个振奋人心的新闻: 1.谷歌已经宣布加入.NET基金会 2.微软加入Linux基金会, ...
- bzoj2820--莫比乌斯反演
题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对. 推导: 设n<=m ans= = 由于gcd(i,j)= ...
- shiro的使用2 灵活使用shiro的密码服务模块
shiro最闪亮的四大特征是认证,授权,加密,会话管理. 上一篇已经演示了如何使用shiro的授权模块,有了shiro这个利器,可以以统一的编码方式对用户的登入,登出,认证进行管理,相当的优雅. 为了 ...
- python中的TypeError错误解决办法
新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...
- MYSQL基础知识和操作(二).png
- Oracle Sales Cloud:报告和分析(BIEE)小细节2——利用变量和过滤器传参(例如,根据提示展示不同部门的数据)
在上一篇随笔中,我们建立了部门和子部门的双提示,并将部门和子部门做了关联.那么,本篇随笔我们重点介绍利用建好的双提示进行传参. 在操作之前,我们来看一个报告和分析的具体需求: [1] 两个有关联的提示 ...