洛谷1101:单词方阵(DFS)
题目描述
给一的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:
第一行输入一个数。(7≤n≤100)。
第二行开始输入的字母矩阵。
输出格式:
突出显示单词的矩阵。
输入输出样例
输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
输入样例#2:
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
输出样例#2:
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
思路
设置方向数组,找到字母"y"的位置,然后利用方向数组来找和"y"相邻的"i",然后在这个方向上进行dfs,如果在该方向上可以组成单词"yizhong",把这些位置记录一下,所有的点遍历结束后,输出就可以了
AC代码
#include <bits/stdc++.h>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;
char ch[110][110];
int vis[110][110];
int n;
int dis[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char cha[]="yizhong";
struct Node
{
int x,y;
}p[1000];
void dfs(int x,int y,int res,int k)
{
if(res==7)
for(int i=0;i<7;i++)
vis[p[i].x][p[i].y]=1;
int dx=x+dis[k][0];
int dy=y+dis[k][1];
if(ch[dx][dy]==cha[res+1]||res==6)
{
p[res].x=x;
p[res].y=y;
dfs(dx,dy,res+1,k);
}
}
int main()
{
ms(vis);
cin>>n;
for(int i=0;i<n;i++)
cin>>ch[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(ch[i][j]=='y')
{
for(int k=0;k<8;k++)
{
int x=i+dis[k][0];
int y=j+dis[k][1];
if(ch[x][y]=='i')
dfs(i,j,0,k);
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(vis[i][j])
cout<<ch[i][j];
else
cout<<"*";
}
cout<<endl;
}
return 0;
}