洛谷1101:单词方阵(DFS)

题目描述
给一n×nn \times 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≤n≤100)。

第二行开始输入n×nn \times n的字母矩阵。

输出格式:
突出显示单词的n×nn \times 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

思路

设置方向数组,找到字母"y"的位置,然后利用方向数组来找和"y"相邻的"i",然后在这个方向上进行dfs,如果在该方向上可以组成单词"yizhong",把这些位置记录一下,所有的点遍历结束后,输出就可以了

AC代码

#include <bits/stdc++.h>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;
char ch[110][110];
int vis[110][110];
int n;
int dis[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char cha[]="yizhong";
struct Node
{
    int x,y;
}p[1000];
void dfs(int x,int y,int res,int k)
{
    if(res==7)
        for(int i=0;i<7;i++)
            vis[p[i].x][p[i].y]=1;
    int dx=x+dis[k][0];
    int dy=y+dis[k][1];
    if(ch[dx][dy]==cha[res+1]||res==6)
    {
        p[res].x=x;
        p[res].y=y;
        dfs(dx,dy,res+1,k);
    }
}
int main()
{
    ms(vis);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>ch[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(ch[i][j]=='y')
            {
                for(int k=0;k<8;k++)
                {
                    int x=i+dis[k][0];
                    int y=j+dis[k][1];
                    if(ch[x][y]=='i')
                        dfs(i,j,0,k);
                }
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(vis[i][j])
                cout<<ch[i][j];
            else
                cout<<"*";
        }
        cout<<endl;
    }
    return 0;
}
posted @ 2018-11-22 19:49  友人-A  阅读(374)  评论(0编辑  收藏  举报