题意就是给出的键盘中都是小写字母
然后给出一串字符串
计算用到另一只手的最少次数
大写的字母如果在shift键以x为边长的正方形周围
就可以用一只手搞定
然后如果是键盘中没有的字母或者打不出大写的字母
就输出-1
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <map>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
map<int,int> m1,m2;
char a[35][35];
char b[500010];
int main()
{
int n,m,x;
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
}
bool flag1=false;
bool flag2=false;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='S')
{
flag1=true;
for(int c=0;c<n;c++)
{
for(int d=0;d<m;d++)
{
if((c-i)*(c-i)+(d-j)*(d-j)<=x*x&&a[c][d]!='S')
m1[a[c][d]-'a']=1;
}
}
}
else
m2[a[i][j]-'a']=1;
}
}
int cnt=0;
int y;
scanf("%d%s",&y,b);
for(int i=0;i<y;i++)
{
if(b[i]>='A'&&b[i]<='Z')
{
if(!flag1)
{
flag2=true;
break;
}
if(m1[b[i]-'A']!=0){}
else if(m2[b[i]-'A']!=0)
cnt++;
else
{
flag2=true;
break;
}
}
else if(m2[b[i]-'a'])
{}
else
{
flag2=true;
break;
}
}
if(flag2)
puts("-1");
else
printf("%d\n",cnt);
return 0;
}