标签:
题目大意:给定一个矩阵,里面是一些字母。要求找到指定字符串的位置,其中单词必须是一条直线(刚开始这里没看到 = =,英语是硬伤。)所以可以直接往八个方向搜索,不过这里只是往一个方向搜索(满足直线要求)。由于不区分大小写,搜索之前可以做个预处理,将小写字母全部转化成大写字母。
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; char grid[55][55]; char str[55]; int m,n,l,flag,dir[8][2]={0,1,0,-1,1,0,-1,0,-1,-1,1,1,-1,1,1,-1}; void dfs(int x,int y,int cnt,int how) { // printf("%d %d\n",x,y); if(x<=0||y<=0||x>m||y>n)return ; if(cnt==l)flag=1; if(flag)return; int i; if(how==-1) {for(i=0;i<8;i++) { int fx=x+dir[i][0]; int fy=y+dir[i][1]; if(str[cnt]==grid[fx][fy])dfs(fx,fy,cnt+1,i); } } else { int fx=x+dir[how][0]; int fy=y+dir[how][1]; if(str[cnt]==grid[fx][fy])dfs(fx,fy,cnt+1,how); } } int main() { int T,i,j,k,q,w,e; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { cin>>grid[i][j]; if(grid[i][j]>='a'&&grid[i][j]<='z')grid[i][j]=grid[i][j]-32; } } scanf("%d",&k); for(i=1;i<=k;i++) { flag=0; scanf("%s",str); l=strlen(str); for(j=0;j<l;j++) { if(str[j]>='a'&&str[j]<='z')str[j]=str[j]-32; } for(q=1;q<=m;q++) {for(w=1;w<=n;w++) { if(grid[q][w]==str[0])dfs(q,w,1,-1); if(flag)break; } if(flag)break; } printf("%d %d\n",q,w); } if(T!=0) printf("\n"); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/aaaaacmer/article/details/46795385