P1101 单词方阵

题目描述

给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:

输入:
    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)。

第二行开始输入nXn的字母矩阵。

 

输出格式:

 

突出显示单词的nXn矩阵。

 

输入输出样例

输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******

 练习搜索

复制代码
#include <cstring>
#include <math.h>
#include <vector>
#include <queue>
#include <cstdio>
#include <iostream>
#include <cstring> 
using namespace std;
int n;
char key[8]={0,'y','i','z','h','o','n','g'};
char map[120][120];
bool ok[120][120];
int line[10][3]; 
void dfs(int x,int y,int t,int last)//t已完成匹配的字母数 
{
    if(t==7)    
    {
        for(int i=1;i<=7;i++)
            ok[line[i][1]][line[i][2]]=1;
        ok[x][y]=1;
        return ;
    }
    line[t][1]=x,line[t][2]=y;
    char c=key[t+1];
    if(map[x+1][y]==c&&(last==0||last==1))    
        dfs(x+1,y,t+1,1);
    if(map[x-1][y]==c&&(last==0||last==2))
        dfs(x-1,y,t+1,2);
    if(map[x][y+1]==c&&(last==0||last==3))
        dfs(x,y+1,t+1,3);
    if(map[x][y-1]==c&&(last==0||last==4))
        dfs(x,y-1,t+1,4);
    if(map[x-1][y-1]==c&&(last==0||last==5))
        dfs(x-1,y-1,t+1,5);
    if(map[x-1][y+1]==c&&(last==0||last==6))
        dfs(x-1,y+1,t+1,6);
    if(map[x+1][y+1]==c&&(last==0||last==7))
        dfs(x+1,y+1,t+1,7);
    if(map[x+1][y-1]==c&&(last==0||last==8))
        dfs(x+1,y-1,t+1,8);
    return;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        cin>>map[i][j];
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(map[i][j]=='y')
            dfs(i,j,1,0);
    }
    for(int i=1;i<=n;i++,cout<<endl)
    for(int j=1;j<=n;j++)
        if(ok[i][j])
            printf("%c",map[i][j]);
        else printf("*");
    return 0;
}
复制代码

 

posted @   浪矢-CL  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示