题目来源:
题目描述:
题目描述
给一 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 矩阵。
输入输出样例
解题思路:
本题我写的有点烦,就是把每个字符是‘y’的点都加入队列,然后进行bfs,如果刚好可以组成yizhong就把这些点全都标记,最后把标记的输出,没标记的就输出“*”。就是在bfs的时候分了好几个方向进行搜索,代码巨长。。。。
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
char zf[7]={'y','i','z','h','o','n','g'};
int dir[8][2]={{1,0},{0,-1},{1,1},{1,-1},{-1,0},{0,1},{-1,1},{-1,-1}};
struct newt{
int x,y,t;
}dian;
int n;
int jl[105][105];
char tu[105][105];
bool pd(newt a,char b)
{
if(a.x>=1&&a.x<=n&&a.y>=1&&a.y<=n&&zf[a.t]==b)return 1;
else return 0;
}
void bfs(int a,int b)
{
if(a<7&&n-a<6&&b<7&&n-b<6)return ;
stack<newt>q;
dian.x=a;dian.y=b;dian.t=0;
q.push(dian);
if(a>=7){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x-1;
nod.y=now.y;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(n-a>=6){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x+1;
nod.y=now.y;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(b>=7){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x;
nod.y=now.y-1;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(n-b>=6){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x;
nod.y=now.y+1;
nod.t=now.t+1;
// cout<<nod.x<<" "<<nod.y<<endl;
if(pd(nod,tu[nod.x][nod.y]))
{
//cout<<tu[nod.x][nod.y]<<" "<<q.size()<<endl;
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(a>=7&&b>=7){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x-1;
nod.y=now.y-1;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(a>=7&&n-b>=6){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x-1;
nod.y=now.y+1;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(n-a>=6&&b>=7){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x+1;
nod.y=now.y-1;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
q.push(dian);
if(n-a>=6&&n-b>=6){
int flag=0;
while(!q.empty())
{
newt now=q.top();
if(now.t==6){
flag=1;break;
}
newt nod;
nod.x=now.x+1;
nod.y=now.y+1;
nod.t=now.t+1;
if(pd(nod,tu[nod.x][nod.y]))
{
q.push(nod);
}
else break;
}
if(flag){
while(!q.empty())
{
jl[q.top().x][q.top().y]=1;
q.pop();
}
}
else {
while(!q.empty())q.pop();
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%s",tu[i]+1);
}
memset(jl,0,sizeof(jl));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(tu[i][j]=='y'&&!jl[i][j])
{
bfs(i,j);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(jl[i][j])cout<<tu[i][j];
else cout<<"*";
cout<<endl;
}
return 0;
}