标签:
问题描述 :
输入:
0 < n, m <= 2000
0 < x, y <= 1000
输出:
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 }
HDU 4517 小小明系列故事---游戏的烦恼 (模拟题)
标签:
原文地址:http://www.cnblogs.com/xinxiangqing/p/5008493.html