UVA - 10010 Where's Waldorf?

来源:互联网 发布:gm3188写频软件 编辑:程序博客网 时间:2024/06/05 23:46


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 100005using 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 55char 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;}



0 0