开一个二维数组记录星号的个数。。。。
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 }