题目链接:洛谷 P1101 单词方阵
题目描述:
给一n×n的字母方阵,内可能蕴含多个 “yizhong” 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *代替,以突出显示单词。
输入:
第一行输入一个数n。(7≤n≤100)。
第二行开始输入n×n的字母矩阵。
输出:
突出显示单词的n×n矩阵。
例如:
代码:
#include<iostream>
#include<string>
using namespace std;
const int maxn=100+10;
int dx[]={-1,1,0,0,-1,-1,1,1}; //定义八个方向
int dy[]={0,0,-1,1,-1,1,-1,1};
int n; //定义方阵的大小
char s[maxn][maxn]; //存储方阵
int vis[maxn][maxn]; //记录是否可以组成yizhong,是的话为1,反之为0
string a="yizhong";
int dfs(int x,int y,int t,int k)
{
if(t==6) //到达最后一个字母g
{
vis[x][y]=1;
return 1;
}
int xx=x+dx[k];
int yy=y+dy[k];
if(xx>=1&&yy>=1&&xx<=n&&yy<=n&&s[xx][yy]==a[t+1]) //判定条件
{
if(dfs(xx,yy,t+1,k)) //如果这个方向上可以组成yizhong,则对该位置进行标记
{
vis[xx][yy]=1;
return 1;
}
}
else //不符合判定条件,说明这条路行不通
return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>s[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(s[i][j]=='y')
{
for(int k=0;k<8;k++)
if(dfs(i,j,0,k))
vis[i][j]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(vis[i][j])
cout<<s[i][j];
else
cout<<"*";
cout<<endl;
}
return 0;
}
感觉自己还是太菜了,题目不难,就是卡了好长时间