HDU 5319 Painter (模拟)
题意:
一个画家画出一张,有3种颜色的笔,R、G、B。R看成'\',B看成'/',G看成这两种的重叠(即叉形)。给的是一个矩阵,矩阵中只有4种符号,除了3种颜色还有'.',代表没有涂色。问最小耗费多少笔即可画成这副图?
思路:
最小耗费就是斜着的可以一笔搞定,但是如果中间隔着'.'或者其他一种形状,则不能一笔,要变两笔。主要麻烦在矩阵不是正方形,而可能是长方形。其实只要按照其画法,从左上往右下方向画,逐个条斜线扫描即可。另一个方向'/'也是如此。
我看到模拟本来就不想敲,扫两遍矩阵,用了vector将他们每一条可能可以一笔画的线先装起来,再进行扫vector进行统计。哎~其实可以直接扫两矩阵就统计的,就是懒。
#include <bits/stdc++.h>
using namespace std;
const int N=; char grid[N][N];
int n;
vector<int> R[N], B[N]; int cal(int col)
{
int cnt=;
for(int i=; i<=n; i++)//一个方向
{
for(int j=; j<=col; j++)
{
if(grid[i][j]=='R'||grid[i][j]=='G')
{
if(i>j) R[i-j].push_back();
else if(i<j) R[j-i+].push_back();
else R[].push_back();
}
else
{
if(i>j) R[i-j].push_back();
else if(i<j) R[j-i+].push_back();
else R[].push_back();
}
}
} for(int i=; i<N; i++)
{
int flag=;
for(int j=; j<R[i].size(); j++)
{
if(!flag && R[i][j]==)
{
cnt++;
flag=;
}
if(!R[i][j]) flag=;
}
} for(int i=; i<=n; i++)//另一方向
{
for(int j=col,k=; j>=; j--,k++)
{
if(grid[i][j]=='B'||grid[i][j]=='G')
{
if(i>k) B[i-k].push_back();
else if(i<k) B[k-i+].push_back();
else B[].push_back();
}
else
{
if(i>k) B[i-k].push_back();
else if(i<k) B[k-i+].push_back();
else B[].push_back();
}
}
} for(int i=; i<N; i++)
{ int flag=;
for(int j=; j<B[i].size(); j++)
{
if(!flag && B[i][j])
{
cnt++;
flag=;
}
if(!B[i][j]) flag=;
}
} return cnt;
} int main()
{
//freopen("input.txt", "r", stdin);
int t;
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=; i<N; i++) R[i].clear(),B[i].clear(); for(int i=; i<=n; i++) scanf("%s", grid[i]+);
printf("%d\n",cal( strlen( grid[]+ ) ));
}
return ;
}
AC代码
HDU 5319 Painter (模拟)的更多相关文章
- hdu 5319 Painter(杭电多校赛第三场)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5319 Painter Time Limit: 2000/1000 MS (Java/Others) ... 
- hdoj 5319 Painter(模拟题)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5319 思路分析:假设颜色R表示为1,颜色B表示为2,颜色G表示为3,因为数据量较小,采用暴力解法即可, ... 
- HDU   5319  Painter(枚举)
		Painter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ... 
- HDU 5319  Painter
		题意:红色从左上向右下涂,蓝色从右上向左下涂,既涂红色又涂蓝色就变成绿色,问最少涂几下能变成给的图. 解法:模拟一下就好了,注意细节. 代码: #include<stdio.h> #inc ... 
- 模拟+思维 HDOJ 5319 Painter
		题目传送门 /* 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最 ... 
- HDU 4121 Xiangqi 模拟题
		Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ... 
- hdu 5071 Chat(模拟)
		题目链接:hdu 5071 Chat 题目大意:模拟题. .. 注意最后说bye的时候仅仅要和讲过话的妹子说再见. 解题思路:用一个map记录每一个等级的妹子讲过多少话以及是否有这个等级的妹子.数组A ... 
- hdu 4740【模拟+深搜】.cpp
		题意: 给出老虎的起始点.方向和驴的起始点.方向.. 规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转.. 当转了一次还没路走就会停下来.. 问他们有没有可能在某一格相遇. ... 
- HDU 2568[前进]模拟
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2568 关键思想:傻傻地模拟 代码如下: #include<iostream> using ... 
随机推荐
- POJ 3685
			Matrix Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 4428 Accepted: 1102 Descriptio ... 
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
			POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ... 
- POJ 2142 The Balance (解不定方程,找最小值)
			这题实际解不定方程:ax+by=c只不过题目要求我们解出的x和y 满足|x|+|y|最小,当|x|+|y|相同时,满足|ax|+|by|最小.首先用扩展欧几里德,很容易得出x和y的解.一开始不妨令a& ... 
- C#中对象的输出
			假设有个Costmer类如下: class Costmer { public string Id { get; set; } public string City { get; set; } publ ... 
- Node 出现 uncaughtException 之后的优雅退出方案
			Node 的异步特性是它最大的魅力,但是在带来便利的同时也带来了不少麻烦和坑,错误捕获就是一个.由于 Node 的异步特性,导致我们无法使用 try/catch 来捕获回调函数中的异常,例如: try ... 
- sql server 2008 评估期已过期解决办法
			开始-->所有程序-->Microsoft SQL Server 2008-->配置工具-->SQL Server 安装中心-->维护-->版本升级,接着按照提示一 ... 
- proc插入数据到数据库
			#include<stdio.h>EXEC SQL INCLUDE SQLCA; void insert (char password_[6],char id_[20],int balan ... 
- iOS开发swift--函数
			函数返回值 ---函数 // 自加函数 func Add(num : Int)->Int{ } //自减函数 func zj(num : Int)->Int{ } //定义返回函数类型 f ... 
- 做个简单的Android列表字母索引控件
			相信大家在许多App中都见到过带字母索引的界面,比如我最近看到的这个开源控件: WaveSideBar 很酷是不是?!!!如果加在例如联系人列表界面上,大大提升了用户体验. 那么这个索引控件要怎么做呢 ... 
- HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)
			Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ... 
