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