题意:给出一个字符矩阵,然后下面每一行的字符串和其匹配,只能按照直线进行匹配,横、竖、斜。如果匹配成功则输出首字母和末字母匹配成功的位置。
思路:DFS,如果找到下一个字母,就继续搜。
#include<iostream>
using namespace std;
char a[105][105];
int N,len2,sx,sy,ex,ey;
bool flag,vis[105][105];
char s[105];
int dir[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1}};
void dfs(int i,int j,int m,int k)
{
int x,y;
if(flag) return;
if(a[i][j]==s[len2-1]&&m==len2)//必须加个m==len2因为给出的字符串可能有重复字母
{
ex=i;ey=j;
flag=1;
return;
}
x=i+dir[k][0];
y=j+dir[k][1];
if(!vis[x][y]&&x>=0&&x<N&&y>=0&&y<N&&a[x][y]==s[m])
{
vis[x][y]=1;
dfs(x,y,m+1,k);
vis[x][y]=0;
}
}
int main()
{
int i,j,k;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
cin>>a[i];
while(scanf("%s",s)!=EOF)
{
if(s[0]=='0') break;
len2=strlen(s);
sx=sy=ex=ey=0;
flag=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(a[i][j]==s[0])
{//找到第一个字母后,按同一个方向搜索
for(k=0;k<8;k++)
{
memset(vis,0,sizeof(vis));
dfs(i,j,1,k);
if(flag)
{
sx=i;sy=j;
goto loop;
}
}
}
loop:
if(flag) printf("%d,%d %d,%d\n",sx+1,sy+1,ex+1,ey+1);
else printf("Not found\n");
}
}
}