2462: [BeiJing2011]矩阵模板
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 1278 Solved: 607
[Submit][Status][Discuss]
Description
给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在
原矩阵中出现过。
所谓01矩阵,就是矩阵中所有元素不是0就是1。
Input
输入文件的第一行为M、N、A、B,参见题目描述。
接下来M行,每行N个字符,非0即1,描述原矩阵。
接下来一行为你要处理的询问数Q。
接下来Q个矩阵,一共Q*A行,每行B个字符,描述Q个01矩阵。
Output
你需要输出Q行,每行为0或者1,表示这个矩阵是否出现过,0表示没有出现过,1表
示出现过。
Sample Input
3 3 2 2
111
000
111
3
11
00
11
11
00
11
111
000
111
3
11
00
11
11
00
11
Sample Output
1
0
1
0
1
HINT
对于100%的数据,N,M<=1000 A,B<=100
Source
正解是矩阵hash,laj不会写于是就大暴力水过咯~
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=1005; 5 int n,m,q,a,b; 6 int aa[MAX][MAX],bb[MAX][MAX]; 7 int main(){ 8 freopen ("matrix.in","r",stdin);freopen ("matrix.out","w",stdout); 9 int i,j,k,x;char s[MAX]; 10 scanf("%d%d%d%d\n",&n,&m,&a,&b); 11 for (i=1;i<=n;i++){ 12 gets(s+1); 13 for (j=1;j<=m;j++) aa[i][j]=s[j]-'0'; 14 } 15 scanf("%d\n",&q); 16 while (q--){ 17 for (i=1;i<=a;i++){ 18 gets(s+1); 19 for (j=1;j<=b;j++) bb[i][j]=s[j]-'0'; 20 } 21 bool flag; 22 for (i=1;i<=n-a+1;i++) 23 for (j=1;j<=m-b+1;j++){ 24 flag=true; 25 for (k=i;k<=i+a-1;k++) 26 for (x=j;x<=j+b-1;x++) 27 if (aa[k][x]!=bb[k-i+1][x-j+1]) {flag=false;goto away;} 28 away:if (flag) goto awa; 29 } 30 awa:if (flag) puts("1"); 31 else puts("0"); 32 } 33 return 0; 34 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》