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;
}
原文地址:https://www.cnblogs.com/CLGYPYJ/p/6972225.html