题目描述 https://www.luogu.org/problemnew/show/P1101
给一n×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≤n≤100)。
第二行开始输入n×n的字母矩阵。
输出格式:
突出显示单词的n×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
存在问题
1. 使用scanf(“%C",&a[i][j]) 会产生错行,因为空格出现的问题
2. bool res=dfs(nx,ny,k,il+1);
if(res) {
b[nx][ny]=c[il];
} else return false;
写法是不对的,应无论如何都要返回
bool res=dfs(nx,ny,k,il+1);
if(res) {
b[nx][ny]=c[il];
}
return res;
#include<stdio.h>
#include<functional>
#include<queue>
#include<vector>
#include<iostream>
#include<sstream>
#include<string.h>
using namespace std;
#define N 101
char a[N][N],b[N][N];
int n;
char c[]="yizhong";
int ilevel=8;
int xx[]= {-1,-1,-1,0,0,1,1,1};
int yy[]= {0,-1,1,-1,1,-1,0,1};
bool dfs(int i,int j,int k,int il) {
//cout<<i<<" "<<j<<" "<<k<<" "<<il<<endl;
if(il==7) {
return true;
} else {
int nx=xx[k]+i;
int ny=yy[k]+j;
if(nx>=0&&nx<n&&ny>=0&&ny<n&&a[nx][ny]==c[il]) {
bool res=dfs(nx,ny,k,il+1);
if(res) {
b[nx][ny]=c[il];
}
return res;
} else
return false;
}
}
int main() {
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
cin>>a[i][j];
b[i][j]='*';
}
//memset(b,'*',sizeof(b));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++) {
if(a[i][j]=='y') {
for(int k=0; k<8; k++) {
int nx=xx[k]+i;
int ny=yy[k]+j;
if(nx>=0&&nx<n&&ny>=0&&ny<n&&a[nx][ny]=='i') {
if(dfs(nx,ny,k,2)) {
b[i][j]='y';
b[nx][ny]='i';
}
}
}
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++)
cout<<b[i][j];
cout<<endl;
}
}