UVa 422(Word-Search Wonder)

Input: 输入的第一行将指定字母矩阵各边的长度(以字符为单位)(字母矩阵将为正方形)。 长度l将在1≤l≤100的范围内。输入的下l行将是矩阵本身,每行将包含l个大写字母。
单词列表随即出现。 每个单词本身都将排成一行; 不超过100个字。
每个单词的长度为100个或更少的字符,并且仅包含大写字母。
输入的最后一行将包含一个零字符

Output: 您的程序应尝试从难题中的单词列表中找到每个单词。 如果单词中的所有字符都可以在字母矩阵中的一条(单向)水平,垂直或对角线中跟踪,则表示单词“找到”。 单词可能不会“环绕”行或列,但是水平和对角单词可能会从右到左(“向后”)继续。 对于找到的每个单词,您的程序应在矩阵中的一行上打印其首字母和最后一个字母的坐标,并以一个空格分隔。 坐标是一对逗号分隔的整数(从1开始索引),其中第一个整数指定行号,第二个整数指定列号。
如果找不到单词,则应输出字符串“ Not found”(而不是一对坐标)。
输入中的每个单词最多只能在谜题中“找到”一次

Sample Input:
5
EDEEE
DISKE
ESEEE
ECEEE
EEEEE
DISC
DISK
DISP
0

Sample Output:
1,2 4,2
2,1 2,4
Not found

翻译用的Copytranslator
大一新手,没有太多想法;因为数据范围比较小,直接暴力搜就行了。。。
思路:遍历整个二维数组先找开头字母,再从上(↑),左上(↗),右(→),右下(↘),下(↓),左下(↙),左(←),左上(↖),这8个方向一个一个找后面的字母。

# include <bits/stdc++.h>

using namespace std;

const int N = 110;
char g[N][N];
int n;
string op;
int dx[8] = {-1,-1,0,1,1,1,0,-1}, dy[8] = {0,1,1,1,0,-1,-1,-1};//8个方向对应的偏移量

void f(void)
{
    int i, j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(g[i][j]==op[0])//找到开头字母
            {
                int d = 0;//当前方向
                while(true)//这个while循环要把8个方向都找一遍,直到找到为止
                {
                    int x, y;
                    int a=i, b=j;
                    int flag = 1;
                    while(flag<op.size())
                    {
                        x = a+dx[d], y = b+dy[d];//x, y为下一个坐标的位置
                        if(x>=0&&x<n&&y>=0&&y<n&&g[x][y]==op[flag])
                        //x, y首先不出界,其次还要满足下一个坐标字母能够匹配
                        {
                            flag++;
                            a=x;
                            b=y;
                        }
                        else break;
                    }
                    if(flag==op.size())//寿终正寝--找完了
                    {
                        cout<<i+1<<","<<j+1<<" "<<x+1<<","<<y+1<<endl;//输出
                        return;
                    }
                    else//没找完就要换方向
                    {
                        if(d==7) break;//8个方向全没找到就不用找了
                        d = (d+1)%8;//下一个方向
                    }
                }
            }
        }
    }
    if(i==n) cout<<"Not found"<<endl;//遍历完还没找到就打印 Not found
}

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>g[i][j];//输入字符数组
        }
    }
    while(cin>>op, op!="0")//输入要找的字符串
    {
        f();
    }

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值