D-Determine the Photo Positio

题目描述

You have taken the graduation picture of graduates. The picture could be regarded as a matrix A of n×nn \times nn×n, each element in A is 0 or 1, representing a blank background or a student, respectively.

However, teachers are too busy to take photos with students and only took a group photo themselves. The photo could be regarded as a matrix B of 1×m1 \times m1×m where each element is 2 representing a teacher.

As a master of photoshop, your job is to put photo B into photo A with the following constraints:

  • you are not allowed to split, rotate or scale the picture, but only translation.
  • each element in matrix B should overlap with an element in A completely, and each teacher should overlap with a blank background, not shelter from a student. 


Please calculate the possible ways that you can put photo B into photo A.

输入描述:

The first line contains two integers n,m(1≤n,m≤2000)n,m(1 \le n,m \le 2000)n,m(1≤n,m≤2000) indicating the size of photos A and B. 

In the next $n$ lines,each line contains n{n}n characters of '0' or '1',representing the matrix A.

The last line contains m{m}m characters of '2', representing matrix B. 

输出描述:

Output one integer in a line, indicating the answer.

示例1

输入

复制

5 3
00000
01110
01110
01110
00000
222

输出

复制

6

示例2

输入

复制

3 2
101
010
101
22

输出

复制

0

示例3

输入

复制

3 1
101
010
101
2

输出

复制

4

思路:将一整行放入矩阵A中,只能放在连续m个为0的区域,因此只能每行每行看,用x记录下连续0的个数,当x>=m时,ans++;当不为0时,x清0;

 代码如下:

#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
string s;
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>s; //因为不能旋转方向,所以只能每行每行研究
        int x =0;//连续0的个数
        for(int i=0;i<s.size();i++){
            if(s[i]=='0'){
                x++;
                if(x>=m) ans++;
            }
            else x=0; //遇到不是0了,清零
        }
    }
    cin>>s;//这个串没啥用,只需要知道个数m即可
    cout<<ans<<endl;
    return 0;
}

上一篇:2017中国大学生程序设计竞赛 - 女生专场


下一篇:DotNetCore系列:解决NET Core项目运行在docker上出现"ssl_choose_client_version:unsupported protocol"问题