P1058: 三秒内找出唐可可
题目描述
给出唐可可的字符画,你需要在3秒内找出她在另一幅字符画中出现的地方。
要求逐字符严格匹配。
输入
第一行空格隔开n和m表示唐可可的字符画有n行m列。
接下来是n行每行m个字符给出唐可可字符画。
接着一行空格隔开u和v表示另一幅字符画有u行v列。
接下来是u行每行v个字符给出另一幅字符画。
输出
一行空格隔开的a和b,表示另一幅字符画中出现的唐可可的左上角坐标即第a行b列处,注意两者都从1开始计算。
如果存在多个这样的a和b,你得输出首先a最小,其次b最小的答案。输入保证一定存在至少一组这样的解。
样例输入复制
3 3 @@@ QWQ \_/ 9 9 @@@@@@@@@ QMQOWOQvQ \_/\_/\_/ @@@@@@@@@ QwQQWQQxQ \_/\_/\_/ @@@@@@@@@ OxooxOQWQ \_/\_/\_/
样例输出复制
4 4
提示
1≤n,m≤50
1≤u,v≤100
输入可能含有空格字符,建议使用按行读入类输入处理函数。
总结:
其实此题完全没有必要用二维char数组取存字符,然后一个一个比较,
利用string类型的substr,可以实现字符串指定长度的对比
还有一个要注意的地方,唐可可的字符串可能出现在任何一个位置,
所以不要每一次for循环后调整pos的参数 +n +m,因为这并不一定
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
int n,m;
void solve(){
string str;
vector<string> s(n);
getline(cin, str); //先吃回车
for(int i = 0; i < n; ++i){
getline(cin, str); //其实没有必要用二维char数组,比较的时候按照行数来就行
s[i] = str;
}
int u, v;
cin >> u >> v;
vector<string> t(u);
getline(cin, str); //先吃回车
for(int i = 0; i < u; ++i){
getline(cin, str);
t[i] = str;
}
for(int k = 0; k <= u-n; ++k){//函数要保留n行
for(int j = 0; j <= v-m; ++j){//列数要保留m行
bool flag = true; //flag得放在需要用到的for循环的上一层
for(int i = 0; i < n; ++i){ //一共要遍历n行
//因为长度是固定的数m
if(t[i+k].substr(j, m) != s[i]){
flag = false;
break;
}
}
if(flag) {
cout << k+1 << " " << j+1 << "\n"; //因为行数列数都是从1开始
return;
}
}
}
}
int main(){
cin >> n >> m;
solve();
return 0;
}