给一 n × n n \times n n×n 的字母方阵,内可能蕴含多个 yizhong
单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 8 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *
代替,以突出显示单词。
第一行输入一个数 n n n。 ( 7 ≤ n ≤ 100 ) (7 \le n \le 100) (7≤n≤100)。
第二行开始输入 n × n n \times n n×n 的字母矩阵。
突出显示单词的 n × n n \times n n×n 矩阵。
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
*******
*******
*******
*******
*******
*******
*******
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
#include
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII;
int n,cnt=0;
char g[101][101];
int dx[]={0,1,0,-1,1,1,-1,-1};
int dy[]={1,0,-1,0,-1,1,-1,1};
string str="yizhong";
vector<PII> s;//记录路径
bool b[101][101];//记录输出'*'还是输出字母
//参数分别时位置(x,y),方向(cx,cy),找到字母的个数num
void dfs(int x, int y, int cx, int cy, int num){
s.push_back({x,y});
if(num==7){
//cout<<"***"<<' '<
while(!s.empty()){
auto t=s.back();
b[t.fi][t.se]=true;
s.pop_back();
}
return;
}
//cout<
//沿着cx,cy方向继续搜索
int tx=x+cx;
int ty=y+cy;
if(tx<=0||tx>n||ty<=0||ty>n) return;//是否越界
if(g[tx][ty]!=str[num]) return;//判断下一个字母是不是要找的
dfs(tx, ty, cx, cy, num+1);
}
//输入
void input(){
repn(i, 1, n)
repn(j, 1, n)
cin>>g[i][j];
}
//输出
void output(){
repn(i, 1, n){
repn(j, 1, n)
if(b[i][j])
cout<<g[i][j];
else
cout<<'*';
cout<<endl;
}
}
void solve(){
cin>>n;
//输入
input();
//找到首字母y,并确定方向
//需要保存走过的路径,这里我用了vector s;
repn(i, 1, n)
repn(j, 1, n)
if(g[i][j]=='y')
rep(k, 0, 8)
if(g[i+dx[k]][j+dy[k]]=='i'){
s.clear();
dfs(i, j, dx[k], dy[k], 1);
}
//输出
output();
}
signed main(){
IOS;
int T=1;
while(T--){
solve();
}
return 0;
}