http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18656
也是一道基础题,让你在一个N×M的矩阵中查找一个给定的字符串,可以分八个方向查找,输出找到的字符串首字母在矩阵中的位置,至少保证矩阵中存在一个要查找的字符串,如果有多个输出最左上的位置即可。
开始 用dfs感觉不太好写,后来就直接用循环搞了,直接枚举八个方向去判断,满足即输出。’
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>
#define CL(arr, val) memset(arr, val, sizeof(arr))
#define ll long long
#define inf 0x7f7f7f7f
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define L(x) (x) << 1
#define R(x) (x) << 1 | 1
#define MID(l, r) (l + r) >> 1
#define Min(x, y) (x) < (y) ? (x) : (y)
#define Max(x, y) (x) < (y) ? (y) : (x)
#define E(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define OUT(x) printf("%I64d\n", x)
#define lowbit(x) (x)&(-x)
#define Read() freopen("a.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);
#define N 100005
using namespace std;
int dir[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};
int main()
{
//Read();
int t,n,m,p,i,j,a,b,flag,x;
char s[55][55],str[55];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
getchar();
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
for(j=0;j<m;j++)
{
if(s[i][j]>='A'&&s[i][j]<='Z')
s[i][j]+=32;
}
}
scanf("%d",&p);
getchar();
while(p--)
{
scanf("%s",str);
int l=strlen(str);
for(i=0;i<l;i++)
{
if(str[i]>='A'&&str[i]<='Z') str[i]+=32;
}
flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(s[i][j]==str[0])
{
int t1=i,t2=j;
int xx,yy;
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[0][0]; yy=yy+dir[0][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) { printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[1][0]; yy=yy+dir[1][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[5][0]; yy=yy+dir[5][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[2][0]; yy=yy+dir[2][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[3][0]; yy=yy+dir[3][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[4][0]; yy=yy+dir[4][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[6][0]; yy=yy+dir[6][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
xx=t1;yy=t2;
for(x=1;x<l;x++)
{
xx=xx+dir[7][0]; yy=yy+dir[7][1];
if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break;
}
if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;}
}
}
if(flag) break;
}
}
if(t) printf("\n");
}
return 0;
}
上面写的还是太繁琐了,后来参考了别人写的,可以把内层的八个for循环转换成一个函数,其余基本差不多,但是简洁了很多。
#include<cstdio>
#include<cstring>
#include<ctype.h>
#define M 55
char s[M][M];
int dir[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};
int n,m,flag;
void dfs(char *str,int len,int p,int k,int x,int y)
{
//printf("%s %d %d %d %d %d\n",str,len,p,k,x,y);
if(k==len) {flag=1; return;}
x=x+dir[p][0];y=y+dir[p][1];
if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]==str[k])
{
dfs(str,len,p,k+1,x,y);
}
return;
}
int main()
{
//freopen("a.txt","r",stdin);
int t,i,j,k,p;
char str[M];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
getchar();
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
for(j=0;j<m;j++)
{
if(isupper(s[i][j])) s[i][j]=tolower(s[i][j]);
}
}
scanf("%d",&p);
getchar();
while(p--)
{
flag=0;
scanf("%s",str);
int l=strlen(str);
for(i=0;i<l;i++)
{
if(isupper(str[i])) str[i]=tolower(str[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k=0;k<8;k++)
{
if(s[i][j]==str[0])
{
//printf("%c\n",s[i][j]);
int x=i,y=j;
dfs(str,l,k,1,x,y);
if(flag)
{printf("%d %d\n",i+1,j+1);break;}
}
}
if(flag) break;
}
if(flag) break;
}
}
if(t) printf("\n");
}
return 0;
}