HDU 4517 小小明系列故事---游戏的烦恼 (模拟题)

问题描述 :

  小小明最近在玩一款游戏,它由n*m大小的矩阵构成,矩阵上会随机产生一些黑色的点,这些点它们可能会连在一起也可能会分开,这些点的个数没有限制,但是每个1*1方格中最多只可能有一个黑点产生。游戏要求玩家以最短的时间用x*y的小矩阵覆盖这个大矩阵,覆盖的要求有以下2点:   1.  x*y大小的小矩阵内必须有x*y个黑点。   2. 多个小矩阵可以重叠,但是每个小矩阵放置的位置必须是独一无二的,即不同的小矩阵内的黑点不能完全相同。例如1*2的矩阵可以横着放,也可以竖着放,这两种方法是不同的,即使它们可能共用黑点。   小小明是个粗心的孩子,他尝试了很多遍都无法将所有的符合要求的小矩阵找到,聪明的你,能不能告诉烦恼中的小小明这个大矩阵里有多少个满足要求的小矩阵呢?

输入:

题目有多组测试数据(不多于100个); 每组测试数据的第一行包含2个正整数n和m,然后第二行是x和y(n,m,x,y的意思如题),接下来n行,每行m个字符,其中’ * ’表示黑点,’ . ’表示空白。 n和m为0则结束输入。

0 < n, m <= 2000

0 < x, y <= 1000

输出:

题目有多组测试数据(不多于100个); 每组测试数据的第一行包含2个正整数n和m,然后第二行是x和y(n,m,x,y的意思如题),接下来n行,每行m个字符,其中’ * ’表示黑点,’ . ’表示空白。 n和m为0则结束输入。

0 < n, m <= 2000 0 < x, y <= 1000

样例输入:

2 3
1 2
**.
.**
0 0

样例输出:

3

解题思路:

(1)、用cnt[ i ][ j ]记录以第i行第j列为终点,向左连续带*号的的长度;

(2)、再从上到下按列处理一次,

(3)、用len1,len2记录以第i行第j列为终点时候,每一行带*号的长度大于等于规定的长/宽的数目。

(4)、相加就是答案。这里有个陷阱,就是当小矩阵行等于列的时候,要将答案除以2。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 2005
 7 int cnt[N][N];
 8 int main()
 9 {
10     int i,j,n,c,r,m;
11     char ch[N];
12     while(scanf("%d%d",&n,&m) && n + m)
13     {
14         scanf("%d%d",&c,&r);
15         int ans = 0;
16         for(i = 1;i <= n;i++)
17         {
18             scanf("%s",&ch);
19             for(j = 1;j <= m;j++)
20             {
21
22                 int flag = ch[j - 1] == ‘*‘?1:0;
23             //    cout<<ch[j - 1]<<endl;
24                 if(flag)
25                     cnt[i][j] = cnt[i][j - 1] + 1;
26                 else
27                     cnt[i][j] = 0;
28
29             }
30         }
31         int len1,len2;
32         for(i = 1;i <= m;i++)
33         {
34             len1 = len2 = 0;
35             for(j = 1;j <= n;j++)
36             {
37             //    cout<<cnt[j][i]<<endl;
38                 if(cnt[j][i] >= c)  len1++;
39                 else   len1 = 0;
40                 if(len1 >= r)
41                 {
42                     ans ++;
43                 }
44                 if(cnt[j][i] >= r)  len2++;
45                 else   len2 = 0;
46                 if(len2 >= c)
47                 {
48                     ans++;
49                 }
50             }
51         }
52         if(c == r)
53             ans /= 2;
54         printf("%d\n",ans);
55     }
56     return 0;
57 }

时间: 2024-12-24 12:01:58

HDU 4517 小小明系列故事---游戏的烦恼 (模拟题)的相关文章

hdu ---(4517)小小明系列故事——游戏的烦恼(Dp)

小小明系列故事——游戏的烦恼 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 841    Accepted Submission(s): 296 Problem Description 小小明最近在玩一款游戏,它由n*m大小的矩阵构成,矩阵上会随机产生一些黑色的点,这些点它们可能会连在一起也可能会分开,这些点的个数没有限制,但 是每个1

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4506 题目大意:找规律,判断k的t次幂前面的系数. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 __int64 fun(__int64 a,__int64 b) 6 { 7 __int64 s=1; 8 while (b) 9 { 10 if (b%2==1) 11 s=s*a%1000000

hdu 4511 小明系列故事——女友的考验

小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 822    Accepted Submission(s): 176 Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则

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

小明系列故事--女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1734    Accepted Submission(s): 466 Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规

HDU - 4511 小明系列故事――女友的考验(AC自动机+DP)

Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: 1.假设小明在的位置是1号点,女朋友在的位置是n号点,则他们之间有n-2个点可以走,小明每次走的时候只能走到比当前所在点编号大的位置: 2.小明来的时候不能按一定的顺序经过某些地方.比如,如果女朋友告诉小明不能经过1 -> 2 -> 3,那么就要求小明来的时候走过的路径不能包含有1 -> 2 ->

AC自动机 + 二维最短路 HDU 4511 小明系列故事――女友的考验

这个题还是比较好想的. 首先将所有不可行方案建立AC自动机,然后跑最短路. 首先将小明放在(sta = 0,pos = 0)处,sta表示AC自动机上点的编号,pos表示坐标点的编号. 根据pos枚举下一次可以到达的地方[pos+1,n],然后sta在自动机上移动,如果某一步会使sta位于有标记的节点,那么这一步是不可行. #include <iostream> #include<time.h> #include<stdio.h> #include<string.

HDU 4528 小明系列故事――捉迷藏

广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单调不减的,所以第一次符合要求的位置就是答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath&g

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

一开始很疑惑自己为什么错了,后来才知道原来这题是可以往回 走的.开4维visit数组记录状态,状态不同则往回走,相同再往回走. 1 30 31 95 S.............................. ..X............................ ...X........................... ....X.......................... .....X......................... ......X........

hdu 4542 &quot;小明系列故事——未知剩余系&quot; (反素数+DFS剪枝)

传送门 参考资料: [1]:https://blog.csdn.net/acdreamers/article/details/25049767 题意: 输入两个数 type , k: ①type = 0,求[1,262]中的因子个数为 k 的反素数,如果求解的答案 > 262,输出"INF": ②type = 1,求使得 num-factor[num] = k 的最小的num: 题解: 只有当 type = 1 时,才有可能输出 "Illegal": 那,什么