HDU4517

开一个二维数组记录星号的个数。。。。

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 2005;
 6 int sum[ maxn ][ maxn ];//sum[i][j]:记录从mat 1 1到mat i j 的“ * ”的个数
 7 int mat[ maxn ][ maxn ];
 8 char s[ maxn ];
 9 int main(){
10     int n,m;
11     while( scanf("%d%d",&n,&m)==2 ){
12         if( n==0||m==0 ) break;
13         int x,y;
14         scanf("%d%d",&x,&y);
15         memset( sum,0,sizeof( sum ) );
16         //memset( mat,0,sizeof( mat ) );//这个memset没有作用,会超时!!!!
17         int tt;
18         for( int i=1;i<=n;i++ ){
19             scanf("%s",1+s);
20             tt=0;
21             for( int j=1;j<=m;j++ ){
22                 if( s[ j ]=='*' ){
23                     mat[ i ][ j ] = 1;
24                     tt++;
25                 }
26                 sum[ i ][ j ] = tt+sum[ i-1 ][ j ];
27             }
28         }
29         /*
30         for( int i=1;i<=n;i++ ){
31             for( int j=1;j<=m;j++ ){
32                 printf("%d ",sum[i][j]);//sum[ i ][ j ] = mat[ i ][ j ]+sum[ i-1 ][ j ]+sum[ i ][ j-1 ]-sum[ i-1 ][ j-1 ];
33             }
34             printf("\n");
35         }
36     */
37         int cnt = 0;
38         int res ;
39         for( int i=1;i<=n;i++ ){
40             for( int j=1;j<=m;j++ ){
41                 res = sum[ i+x-1 ][ j+y-1 ]-sum[ i+x-1 ][ j-1 ]-sum[ i-1 ][ j+y-1 ]+sum[ i-1 ][ j-1 ];
42                 if( res==x*y ) cnt ++;
43                 if( x!=y ) {
44                     res = sum[ i+y-1 ][ j+x-1 ]-sum[ i+y-1 ][ j-1 ]-sum[ i-1 ][ j+x-1 ]+sum[ i-1 ][ j-1 ];
45                     if( res==x*y ) cnt ++;
46                 }
47             }
48         }
49         printf("%d\n",cnt);
50     }
51     return 0;
52 }

 

posted @ 2013-03-23 22:13  xxx0624  阅读(330)  评论(0编辑  收藏  举报