Problem Description
小小明最近在玩一款游戏,它由n*m大小的矩阵构成,矩阵上会随机产生一些黑色的点,这些点它们可能会连在一起也可能会分开,这些点的个数没有限制,但是每个1*1方格中最多只可能有一个黑点产生。游戏要求玩家以最短的时间用x*y的小矩阵覆盖这个大矩阵,覆盖的要求有以下2点:
  1. x*y大小的小矩阵内必须有x*y个黑点。
  2. 多个小矩阵可以重叠,但是每个小矩阵放置的位置必须是独一无二的,即不同的小矩阵内的黑点不能完全相同。例如1*2的矩阵可以横着放,也可以竖着放,这两种方法是不同的,即使它们可能共用黑点。
  小小明是个粗心的孩子,他尝试了很多遍都无法将所有的符合要求的小矩阵找到,聪明的你,能不能告诉烦恼中的小小明这个大矩阵里有多少个满足要求的小矩阵呢?
做法:关键是统计每个矩形的面积,刚开始用二维树状数组来统计超时了。其实用递推的方法可以很快的预处理求出矩形(1,1)~(i,j)的面积,接下来枚举每个符合条件的矩形,判断其面积是否等于x*y即可。
View Code

 1 /*
 2  *Author:       Zhaofa Fang
 3  *Created time: 2013-03-23-21.36
 4  *Language:     C++
 5  */
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <sstream>
 9 #include <iostream>
10 #include <cmath>
11 #include <cstring>
12 #include <algorithm>
13 #include <string>
14 #include <utility>
15 #include <vector>
16 #include <queue>
17 #include <stack>
18 #include <map>
19 #include <set>
20 using namespace std;
21
22 typedef long long ll;
23 #define DEBUG(x) cout<< #x << ':' << x << endl
24 #define REP(i,n) for(int i=0;i < (n);i++)
25 #define REPD(i,n) for(int i=(n-1);i >= 0;i--)
26 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
27 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
28 #define PII pair<int,int>
29 #define PB push_back
30 #define MP make_pair
31 #define ft first
32 #define sd second
33 #define lowbit(x) (x&(-x))
34 #define INF (1<<30)
35
36 int n,m;
37 int C[2011][2011];
38 char str[2011][2011];
39
40
41 void fun(){
42     C[0][0] = 0;
43     FOR(i,1,n){
44         C[i][0] = 0;
45         FOR(j,1,m){
46             C[i][j] = C[i][j-1]+(str[i][j]=='*'?1:0);
47         }
48     }
49     FOR(i,2,n){
50         FOR(j,1,m){
51             C[i][j] += C[i-1][j];
52         }
53     }
54 }
55 int Area(int x1,int y1,int x2,int y2){
56     if(x1>x2)swap(x1,x2);
57     if(y1>y2)swap(y1,y2);
58     return C[x2][y2]-C[x2][y1-1]-C[x1-1][y2]+C[x1-1][y1-1];
59 }
60
61  int main()
62 {
63      //freopen("in","r",stdin);
64      //freopen("out","w",stdout);
65      while(~scanf("%d%d",&n,&m),n,m){
66         int x,y;
67         scanf("%d%d",&x,&y);
68         FOR(i,1,n)scanf("%s",str[i]+1);
69         fun();
70         int ans = 0;
71         FOR(i,1,n){
72             FOR(j,1,m){
73                 if(str[i][j] != '*')continue;
74                 int xx1 = i+x-1;
75                 int yy1 = j+y-1;
76                 if(!(xx1<1||yy1<1||xx1>n||yy1>m)){
77                     if(Area(i,j,xx1,yy1) == x*y)ans++;
78
79                 }
80
81                 int xx2 = i+y-1;
82                 int yy2 = j+x-1;
83                 if(xx2 == xx1 && yy2==yy1)continue;
84                 if(xx2<1||yy2<1||xx2>n||yy2>m)continue;
85                 if(Area(i,j,xx2,yy2) == x*y)ans++;
86
87             }
88         }
89         printf("%d\n",ans);
90      }
91      return 0;
92  }

转载于:https://www.cnblogs.com/fzf123/archive/2013/03/23/2977813.html

hdu 4517 小小明系列故事——游戏的烦恼(统计类题目)相关推荐

  1. hdu 4501 小明系列故事——买年货 多重背包

    小明系列故事--买年货                                                                          Time Limit: 500 ...

  2. hdu 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total ...

  3. HDU 4506 小明系列故事——师兄帮帮忙

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  4. HDU 4501 小明系列故事——买年货

    小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tota ...

  5. HDU - 4511 小明系列故事——女友的考验(AC自动机+dp)

    题目链接:点击查看 题目大意:小明在点 1 而小明的女朋友在点 n ,现在小明要去找女朋友,满足以下两个条件: 途径的序号满足严格递增 小明的女朋友给小明提出了 m 条路径是不允许走的 在满足上述两条 ...

  6. HDU 4511 小明系列故事——女友的考验 ( Trie图 DP )

    题意 :  给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...

  7. HDU 4528 小明系列故事——捉迷藏

    题目链接~~> 做题感悟:这题需要逆向思维,先预处理一下就好. 解题思路:先预处理一下将可以看到 D 与 E 的点标记一下,这样 bfs()遍历迷宫时就可以节省很多时间,还要注意:可以重复走走过 ...

  8. hdu 4528小明系列故事——捉迷藏

    题目:点击打开链接 宽搜.注意判重.判重导致比赛的时候错了两次. #include <cmath> #include <ctime> #include <iostream ...

  9. hdu4528小明系列故事——捉迷藏(bfs)

    小明系列故事--捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  10. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

最新文章

  1. winform解析json
  2. 隐知识:reloadData 方法之后,view并不会立即更新其contentSize
  3. Linux常用基本命令:三剑客命令之-awk输入输出分隔符
  4. kinmall分析百度亮剑区块链能否险中求胜?
  5. 力扣174. 地下城游戏
  6. matlab安装MinGW-64代码C/C++编译器的方法
  7. 函数式编程 -- 函子(Functor)
  8. C语言指针作为参数的传递问题
  9. 形容人的内核是什么意思_那些对你忽冷忽热的人到底什么意思?
  10. 架构师:成为架构师可能会面临的问题
  11. 朗途职业规划之二 基本分析报告 (北森测评)
  12. 74ls20设计半加器_实验二++组合逻辑电路的设计与测试.ppt
  13. 9.DLL的入口函数DllMain函数
  14. java处理环比增长率
  15. Computer Shader的理解记录
  16. 《打造游戏开源平台 GameHub 》by:eli.ocean
  17. 【小白米日志】树莓派3b+四位共阴数码管的连接和驱动
  18. idea启动项目提示端口占用怎么办
  19. linux-011之termios.h头文件
  20. ldpc译码讲解_LDPC码及其译码实现

热门文章

  1. astrolog php,如何在苹果MAC上使用Astrolog32 zet9等占星软件
  2. 安卓手机阅读器_得到电纸书阅读器到底如何,值不值得买?使用一个月后,我告诉你答案!...
  3. Canon iC MF8350Cdn打印机驱动安装,解决内存不能为written问题
  4. resnet152训练_ResNet改进版来了!可训练网络超过3000层!相同深度精度更高
  5. Android实现边录音边播放
  6. 质子矩阵助力工厂从“制造”向“智造”快速转型!
  7. 训练集和测试集的区别
  8. 两向量叉乘的计算公式_向量的叉乘运算法则
  9. 阿里电话面试(算法工程师)
  10. VelocityTracker使用详解