Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 960 Accepted Submission(s): 341
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<math.h> 6 #include<queue> 7 #include<string.h> 8 #include<stack> 9 #include<vector> 10 #include<map> 11 #define sc(x) scanf("%I64d",&x) 12 #define pr(x) printf("%I64d",x) 13 #define prr(x) printf("%I64d\n",x) 14 #define prrr(x) printf(" %I64d",x) 15 #define FOR(i,p,q) for(int i=p;i<=q;i++) 16 int ch(int x,int y,int z,int t); 17 using namespace std; 18 char ma[2001][2001]; 19 int a[2001][2001]; 20 int p,q; 21 int main(void) 22 { 23 int n,i,j,k; 24 int nn,mm; 25 while(scanf("%d %d",&p,&q),p!=0||q!=0) 26 { 27 memset(a,0,sizeof(a)); 28 scanf("%d %d ",&nn,&mm); 29 for(i=1; i<=p; i++) 30 { 31 gets(ma[i]+1); 32 } 33 for(i=1; i<=p; i++) 34 { 35 for(j=1; j<=q; j++) 36 { 37 if(ma[i][j]==‘*‘) 38 { 39 a[i][j]=a[i][j-1]+1; 40 } 41 else 42 { 43 a[i][j]=a[i][j-1]; 44 } 45 } 46 }for(i=1;i<=q;i++) 47 { 48 for(j=1;j<=p;j++) 49 { 50 a[j][i]+=a[j-1][i]; 51 } 52 } 53 int sum=0; 54 for(i=1;i<=p;i++) 55 { 56 for(j=1;j<=q;j++) 57 { 58 if(ma[i][j]=‘*‘) 59 { 60 sum+=ch(i,j,nn,mm);//以当前的点为左上定点找长为nn宽为mm的矩阵 61 sum+=ch(i,j,mm,nn);//以当前的点为左上定点找长为mm宽为nn的矩阵 62 } 63 } 64 } 65 if(nn==mm)//如果长和宽相等那么上面所找的两种矩阵就一样,所以/2; 66 { 67 sum/=2; 68 } 69 printf("%d\n",sum); 70 } 71 return 0; 72 73 } 74 75 int ch(int x,int y,int z,int t)//判断当前所选矩阵的‘*’的个数是否符合矩阵的大小 76 { 77 int n,i,j,k; 78 int nx=x+z-1; 79 int ny=y+t-1; 80 if(nx<=p&&ny<=q)//判断是否超边界 81 { 82 k=a[nx][ny]-a[nx][y-1]-(a[x-1][ny]-a[x-1][y-1]); 83 if(k==z*t) 84 { 85 return 1; 86 } 87 }return 0; 88 89 }
原文:http://www.cnblogs.com/zzuli2sjy/p/5146587.html