这题是个简单的字符串问题。大意是给定二维的字符数组,大小写均可,找出与输入字符串相等的第一个字母的位置。我读题的时候,好像有说如果有多个相符该怎么输出。但看了好多人代码,直接忽略了这个条件,而且果断过了,很费解,希望知道的解答一下。忽略这个条件就很好写了,输入之前先预处理,都转成大写或小写。然后就分8个方向搜就完事了。代码有点长。
<span style="font-size:18px;">#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
using namespace std;
char map[55][55];
char simp[55];
int m,n;
void dfs()
{
int k=0;int len=strlen(simp);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]==simp[0])
{
int x=i,y=j;k=0;//下面就是分8个方向
while(x>0&&simp[k+1]==map[x-1][y])
{
x--;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(x<n-1&&simp[k+1]==map[x+1][y])
{
x++;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(y>0&&simp[k+1]==map[x][y-1])
{
y--;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(y<m-1&&simp[k+1]==map[x][y+1])
{
y++;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(x>0&&y>0&&simp[k+1]==map[x-1][y-1])
{
x--;y--;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(x>0&&y<m-1&&simp[k+1]==map[x-1][y+1])
{
x--;y++;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(x<n-1&&y<m-1&&simp[k+1]==map[x+1][y+1])
{
x++;y++;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
x=i,y=j;k=0;
while(x<n-1&&y>0&&simp[k]==map[x+1][y-1])
{
x++;y--;k++;
if(k==len-1)
{
cout<<i+1<<" "<<j+1<<endl;return;
}
}
}
}
}
return;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
map[i][j]=toupper(map[i][j]);//预处理
}
}
int count;
cin>>count;
for(int i=0;i<count;i++)
{
cin>>simp;
for(int j=0;j<strlen(simp);j++)
{
simp[j]=toupper(simp[j]);//预处理
}
dfs();
}
if(t)
cout<<endl;
}
return 0;
}</span>