洛谷-P1101 单词方阵
题目描述
给一(n imes n)的字母方阵,内可能蕴含多个“yizhong
”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*
代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入格式
第一行输入一个数n。((7 le n le 100))。
第二行开始输入(n imes n)的字母矩阵。
输出格式
突出显示单词的(n imes n)矩阵。
输入输出样例
输入 #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
C++代码
#include <iostream>
using namespace std;
int dir[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char a[100][100],b[100][100],c[]="yizhong";
void dfs(int x, int y, int k, int m) {
if(m==6) {
for(;m>=0;--m) {
b[x][y]=c[m];
x-=dir[k][0];
y-=dir[k][1];
}
return ;
}
x+=dir[k][0];
y+=dir[k][1];
if(a[x][y]==c[m+1])
dfs(x,y,k,m+1);
}
int main() {
int n,i,j,k,x,y;
cin>>n;
for(i=0;i<n;++i)
for(j=0;j<n;++j) {
cin>>a[i][j];
b[i][j]='*';
}
for(i=0;i<n;++i)
for(j=0;j<n;++j)
if(a[i][j]=='y')
for(k=0;k<8;++k)
dfs(i,j,k,0);
for(i=0;i<n;++i) {
for(j=0;j<n;++j)
cout<<b[i][j];
cout<<endl;
}
return 0;
}