UVA - 10010 Where's Waldorf?


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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值