P1101 单词方阵
题目描述
给一 n \times nn×n 的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:
第一行输入一个数 nn 。( 7 \le n \le 1007≤n≤100 )。
第二行开始输入 n \times nn×n 的字母矩阵。
输出格式:
突出显示单词的 n \times nn×n 矩阵。
输入输出样例
输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******
题解: DFS,每次直接固定方向的搜索。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=110;
char mapp[MAXN][MAXN];
int vis[MAXN][MAXN];
int ans[MAXN][MAXN];
char str[]={"yizhong"};
int n;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,1,-1,1,-1,-1,1};
bool check(int x,int y,int k)
{
if(x<0||x>=n||y<0||y>n||mapp[x][y]!=str[k])
return false;
return true;
}
void print()//此处是记录那些点是可以构成yizhong
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(vis[i][j]==1)
ans[i][j]++;
}
}
}
void dfs(int x,int y ,int mx,int my,int k)
{
if(k==6&&mapp[x][y]=='g') {
vis[x][y]=1;
print();
vis[x][y]=0;
return ;
}
int kx=x+mx;
int ky=y+my;
if(check(kx,ky,k+1)){
vis[kx][ky]=1;
dfs(kx,ky,mx,my,k+1);
vis[kx][ky]=0;
}
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",mapp[i]);
memset(vis,0, sizeof(vis));
memset(ans,0, sizeof(ans));
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(mapp[i][j]=='y') {
for(int k=0;k<8;k++) {
vis[i][j] = 1;
dfs(i, j,dx[k],dy[k] ,0);
vis[i][j] = 0;
}
}
}
}
for(int i=0;i<n;i++){
for (int j = 0; j < n; ++j) {
if(ans[i][j]>=1)
printf("%c",mapp[i][j]);
else
printf("*");
}
printf("\n");
}
return 0;
}
/*
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
*/