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 }

 

你可能感兴趣的:(HDU)