• 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;
    }
  • 相关阅读:
    ffmpeg使用中文使用+解释
    CentOS GCC升级到4.6.1(转)
    C#委托与直接调用方法区别
    微软面试题,倒置数组
    MSDN中介绍的图片格式
    你们的学校是几流
    VS代码模版
    正则表达式
    Visual Studio 2010中添加项目模板
    泛型详解
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6972225.html
Copyright © 2020-2023  润新知